2012-11-07 4 views
1

우리와 일부 타사에서 개발 한 어셈블리가있는 C# 라이브러리가 있습니다. 모든 어셈블리 파일을 하나의 어셈블리 파일에 저장해야합니다. 내가 병합에 나는 다음과 같은 오류가 발생했습니다 ILMerge를 사용하여 모든 것을하려고하면Embedding Merge .NET v1 어셈블리 어셈블리 .NET v4 어셈블리 어셈블리

: 나는이 병합에서 TestLibrary를 제거하면

An exception occurred during merging:

ILMerge.Merge: The assembly 'TestLibrary' is not marked as containing only managed code. (Consider using the /zeroPeKind option -- but read the documentation first!) em ILMerging.ILMerge.Merge() em ILMerging.ILMerge.Main(String[] args)

, 그것은 잘 작동합니다. 하지만 내 프로젝트가 작동하도록하려면 TestLibrary를 별도로 참조하고 useLegacyV2RuntimeActivationPolicy = "true"를 활성화하십시오.

그래서, 조금 더 연구 후에 나는 Jeffrey Richter를 사용하여 포함 된 리소스를 사용하기로 결정했습니다 :

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { 
    String resourceName = "AssemblyLoadingAndReflection." + 
     new AssemblyName(args.Name).Name + ".dll"; 
    using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { 
     Byte[] assemblyData = new Byte[stream.Length]; 
     stream.Read(assemblyData, 0, assemblyData.Length); 
     return Assembly.Load(assemblyData); 
    } 
}; 

그것은 자원 바이트를로드하지만 Assembly.Load이 프로그램이 잘못된 형식을 가지고 말을 실패합니다.

TestLibrary는 C++ .Net v1.0 라이브러리입니다.

+3

에 설명되어 있습니다. 오류 메시지는 매우 자명합니다. –

+0

ILMerge가 왜 그렇게 인기가 있는지 나는 결코 알지 못합니다. 어셈블리를 단일 EXE에 병합하는 것은 이미 VS에서 아무런 제한없이 잘 지원됩니다. 최종 파일 이름은 setup.exe입니다. 이전에이 파일을 사용했습니다. 솔루션에 설치 프로젝트를 추가하십시오. –

+0

@ hans-passant 나는 이것이 구약임을 알고 있지만 우리는 그것을 내부 프레임 워크/라이브러리에 사용한다. 우리는 멋진 것들을하는 많은 프로젝트를 가지고 있으며, 우리의 어플리케이션에서 사용할 수 있도록 하나의 DLL로 병합합니다. 이것은 의존성의 수를 줄이고 호출 응용 프로그램에 노출되기를 원치 않는 외부 유틸리티 (예 : restsharp)를 "숨 깁니다". 우리는 배포되는 응용 프로그램에 대해 어셈블리를 병합하지 않으며 setup.exe 나 유사한 대안을 사용합니다. – Mightymuke

답변

0

ILMerge는 단순히 네이티브 코드가 포함 된 어셈블리를 처리 할 수 ​​없습니다. 사용하기 전에 런타임에 dll을 추출하거나 dll을 제공해야합니다. 또한 ILMerge using 2 third party dll's C++