우리와 일부 타사에서 개발 한 어셈블리가있는 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 라이브러리입니다.
에 설명되어 있습니다. 오류 메시지는 매우 자명합니다. –
ILMerge가 왜 그렇게 인기가 있는지 나는 결코 알지 못합니다. 어셈블리를 단일 EXE에 병합하는 것은 이미 VS에서 아무런 제한없이 잘 지원됩니다. 최종 파일 이름은 setup.exe입니다. 이전에이 파일을 사용했습니다. 솔루션에 설치 프로젝트를 추가하십시오. –
@ hans-passant 나는 이것이 구약임을 알고 있지만 우리는 그것을 내부 프레임 워크/라이브러리에 사용한다. 우리는 멋진 것들을하는 많은 프로젝트를 가지고 있으며, 우리의 어플리케이션에서 사용할 수 있도록 하나의 DLL로 병합합니다. 이것은 의존성의 수를 줄이고 호출 응용 프로그램에 노출되기를 원치 않는 외부 유틸리티 (예 : restsharp)를 "숨 깁니다". 우리는 배포되는 응용 프로그램에 대해 어셈블리를 병합하지 않으며 setup.exe 나 유사한 대안을 사용합니다. – Mightymuke