2014-10-11 2 views
4

을 .NET 3.5을 병합 : AssemblyA 현재 프로젝트 출력을 $ (이다문제는 .NET 2.0 어셈블리

ILMerge version 2.13.307.0 
Copyright (C) Microsoft Corporation 2004-2006. All rights reserved. 
ILMerge /out:Assembly.dll AssemblyA.dll AssemblyB.dll /targetplatform:v2,C:\Windows\Microsoft.NET\Framework\v3.5 /log:log.txt 
Set platform to 'v2', using directory 'C:\Windows\Microsoft.NET\Framework\v3.5' for mscorlib.dll 
An exception occurred during merging: 
Unable to cast object of type 'System.Compiler.Class' to type 'System.Compiler.Struct'. 
    at System.Compiler.SystemTypes.Initialize(Boolean doNotLockFile, Boolean getDebugInfo, PostAssemblyLoadProcessor postAssemblyLoad) 
    at ILMerging.ILMerge.Merge() 
    at ILMerging.ILMerge.Main(String[] args) 

TargetFileName)이고 AssemblyB는 참조 된 어셈블리입니다.

  1. AssemblyA => V3.5
  2. AssemblyB => 2.0

이상한 것은은 내가 명령을 변경할 때 작동 .NET 4를 사용하는 것을 :

ILMerge /out:Assembly.dll AssemblyA.dll AssemblyB.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /log:log.txt 

병합 된 어셈블리가 3.5 버전이 아닌 4가되기를 원하기 때문에 이전 명령을 작동 시키려면 어떻게해야합니까? 아니면이 오류를 어떻게 해결합니까?

+1

mscorlib, c : \ windows \ microsoft.net \ framework \ v2.0.50727에 적절한 디렉토리를 사용하십시오. .NET 3.5는 새로운 런타임 버전이 아닙니다. v4 명령 줄이 [위험한 잘못] (http://stackoverflow.com/a/13750130/17034)인지 확인하십시오. –

+0

@HansPassant 주석 주셔서 감사합니다. 첫 번째 명령을 v3.5에서 2로 변경합니다 ... v4 명령 줄이 위험한 방식으로 잘못되었음을 알려주시겠습니까? – avantprime

+0

@HansPassant 올바른 해결책을 제공 한 것으로 인정 받기를 원하는 경우 답변을 답변으로 게시하십시오. – avantprime

답변

7

사용하여 디렉토리 'C : \ 윈도우 \ 프레임 워크 \의 V3.5 \ Microsoft.NET'

가 mscorlib.dll은 보라를 들어,이 디렉토리는 mscorlib.dll에 포함되어 있지 않습니다. NET Framework 버전 3.0, 3.5 및 3.5SP1에는 새로운 런타임 버전이 포함되어 있지 않습니다. CLR, 지터 및 여러 기본 어셈블리는 여전히 v2.0입니다. 이 이후 릴리스의 유일한 차이점은 추가 된 어셈블리입니다.

그래서 필요한 옵션을 사용하면 .NET 4.x의 경우,는 C 대상으로 할 때, 매우, 매우 조심해야 할 /targetplatform:v2,C:\Windows\Microsoft.NET\Framework\v2.0.50727

FWIW입니다 : \ WINDOWS를 \ microsoft.net 디렉토리가 더 이상의 홈 디렉토리입니다 참조 어셈블리. 이제 c : \ program files (x86) \ reference 어셈블리에 있습니다. 이 오류가 발생하면 컴퓨터에 .NET 4.5 이상이 설치된 경우 runtime errors을 진단하기가 매우 어려워 질 수 있습니다. 그리고 지금은 특정 서브 디렉토리를 선택합니다.