0

대상 프레임 워크 .NET Framework 3.5에 대해 개발 중입니다. 프로젝트 Logger 프로젝트에서 참조 된 어셈블리입니다 다음 라이브러리Visual Studio에서 최신 대상 프레임 워크의 어셈블리를 사용합니다.

Newtonsoft.Json.dll 
Version = 4.5.0.0 
AssemblyFileVersion = 5.0.8.16617 
PublicKeyToken = 30ad4fe6b2a6aeed 
TargetFramework = v3.5 

를 사용합니다.

MyApp 프로젝트는 Logger 프로젝트에 대한 프로젝트 참조가 있으므로 Newtonsoft.Json.dll에 대한 간접 참조가 있습니다.

Copy Local 속성을 true으로 설정하면 Newtonsoft.Json.dll이 출력 디렉터리에 복사됩니다. MyApp을 컴파일하면 Newtonsoft.Json.dll이 해당 출력 디렉토리로 복사됩니다. GAC에 Newtonsoft.Json.dll이 없음을 유의하십시오.

지금까지 Fine. 더 이상 MyApp의 출력 디렉토리에 복사됩니다 Newtonsoft.Json.dll를 참조하는 프로젝트의 원인이됩니다 .NET Framework 4.0의 GAC에 설치이 라이브러리를 갖는

Newtonsoft.Json.dll 
Version = 4.5.0.0 
AssemblyFileVersion = 4.5.8.15203 
PublicKeyToken = 30ad4fe6b2a6aeed 
TargetFramework = v4.0 

:

는 지금은 .NET Framework 4.0 GAC에 다음 라이브러리 ( %windir%\Microsoft.NET\assembly)를 설치하지 . 그러나 여전히 출력 디렉토리 Logger에 복사됩니다.

나는 나 자신이 행동을 설명하려 :이 프로젝트는 Copy Local 속성이 true로 설정되어 있기 때문에 Newtonsoft.Json.dllLogger의 출력 디렉토리에 복사됩니다 참조.

그러나 Newtonsoft.Json.dll이 더 이상 출력 디렉토리 MyApp에 복사되지 않습니다. .NET Framework 4.0의 GAC에 설치 한 라이브러리는 내 프로젝트가 빌드 .NET Framework 3.5에 대해 빌드 된 이후로 (내 의견으로는) 빌드 시스템에 '보이지'않아야합니다.

는 런타임에있을 것입니다 System.IO.FileNotFoundExceptionNewtonsoft.Json.dll 라이브러리 (라이브러리가 MyApp에서 사용하는 GAC 3.5되지 않습니다 4.0 GAC에 위치하기 때문에이 나에게 분명하다)를 찾을 수 없습니다 때문입니다.

  • 대상 프레임 워크 3.5 프로젝트의 빌드 시스템이 GAC의 어셈블리에 대해 알고있는 이유는 무엇입니까? .NET Framework 4.0?
  • Newtonsoft.Json.dll이 GAC 4.0에있을 때 MyApp의 출력 디렉토리에 대상 프레임 워크 3.5가있는 로컬 참조 Newtonsoft.Json.dll을 어떻게 복사합니까?
+0

왜 GAC에 라이브러리를 설치하나요? – galenus

+0

이것은 작동하지 않을 것입니다. 실제로 Newtonsoft.Json.dll의 해당 버전을 사용하려면 .NET 4.5를 대상으로해야합니다. .NET 3.5를 대상으로하는 것이 잘못 된 부분입니다. 해당 어셈블리의 이전 버전도 사용할 수 있지만 4.5 버전을 사용하려는 Logger 어셈블리는 여전히 사용할 수 없습니다. 3.5를 대상으로하면 * 사용하는 모든 어셈블리가 v2 CLR에서 실행될 수 있어야합니다. GAC에 문제가 있으면 해결 방법이 아닙니다. –

+0

@HansPassant 그가 언급하는 어셈블리의 첫 번째 버전은 3.5를 목표로하는 것 같습니다 (마지막 줄!). 만약 내가 그때 착각하지 않는다면, 그가 올바른 버전을 참조하도록 응용 프로그램을 관리하는 한 괜찮습니다. – Kjartan

답변

0

참조 용 속성에서 Specific version을 true로 설정 했습니까? 나는 GAC가 컴파일하는 동안 먼저 검색 될 것이라고 생각한다. 따라서 버전을 지정하지 않으면 모든 버전이 "수용 가능"하다고 간주되고 다른 버전은 익스포트되지 않는다.

버전을 지정하면 GAC의 버전을 유효하지 않은 것으로 간주하고 다른 버전은 이전과 같이 내보내야합니다.

업데이트 : 빠른 검색을 수행하여 the Newtonsoft package seems to be released under an MIT liscence이라는 것을 발견했습니다. 이는 실제로 원하는대로 할 수 있음을 의미합니다.

당신이 필요로하는 타겟 프레임 워크와 버전 번호를 가지고 직접 컴파일 할 수있는 해결책이 있습니다.

+0

에 Json 라이브러리를 설치할 때 발생하는 시나리오입니다 두 라이브러리 모두 버전 4.5.0.0입니다. 이것은 리플렉터가 찾은 버전 정보이며이 버전 정보는 Visual Studio에서도 제공됩니다. 차이점은'AssemblyFileVersion'이지만 시각 스튜디오는이를 무시하는 것 같습니다. – faronel

+0

@faronel Ah, Ok. 나는 네가 그 일에 눈치 채지 못했다. 좀 이상한데, 같은 버전 번호를 가진'Newtonsoft.Json.dll'의 다른 버전이 있습니다. (닷넷 프레임 워크의 다른 버전을 목표로 할 때 어떻게 다를 수 있습니까?) 나는'Newtonsoft' dll이 당신이 스스로 컴파일하는 것이 아니라고 가정합니다. (만약 그렇다면, 당신은 간단하게 이것의 다른 버전을 만들어서 이것을 해결할 수 있습니다.) – Kjartan

+1

'Newtonsoft.Json.dll' 라이브러리는 스스로 컴파일되지 않습니다. 타겟 프레임 워크 3.5를 사용하는 버전은 http://json.codeplex.com/에서 다운로드 할 수 있으며 zip 파일의/Bin/Net35/Newtonsoft.Json.dll에 있습니다. 다른 버전 번호로 라이브러리를 컴파일 중입니다 대안입니다. 그러나 왜 내 목표 프레임 워크가 3.5이고 GAC 라이브러리 중 하나가 4.0이기 때문에 이것이 작동하지 않는지 궁금합니다. – faronel