2016-12-13 5 views
2

제 3자가 관리되지 않는 코드 (86/64로 구분) 컴파일 (86/64로 구분) 플랫폼 중 하나에 대한 관리 C# .NET을 DLL을 제공합니다 : 2 개의 관리되는 x86/x64 dll을 하나의 관리되는 AnyCpu 라이브러리에 결합하는 방법은 무엇입니까?

  • FooManaged_x86.dll
  • FooManaged_x64.dll을

    이것은 수신 한 것입니다 (원시 코드도 관리되지 않는 dll도 아닙니다).

    그런 다음 x86 또는 x64를 대상으로하는 C# .NET 응용 프로그램 (또는 라이브러리)을 만들고 해당 관리 DLL을 직접 참조 할 수 있습니다. 모든 목표는 훌륭하지만 하나의 특정 플랫폼으로 제한됩니다.

    내 응용 프로그램은 AnyCpu (목표)를 대상으로하고 x64 dll (컴파일러 경고 표시)을 참조하며 실제로 x64로 실행될 때만 작동합니다. 다시 말하지만, 이것은 하나의 특정 플랫폼에 묶여 있습니다.

    은 내가 동적 (후드 같이 DllImport 및 수동 AssemblyLoad를 사용하여) 런타임시 생성하라 DLL을 로딩하여 하나의 관리 DLL로 (Fody.Costura와) 관리되지 않는 86/64 DLL을 결합 할 수 있다는 것을 알고있다. 나는 큰 성공을 거두었지만이 방법은 에 적합하지 않다. dlls. 관리 C#에서 관리되는 C# dll로 PInvoke를해야합니다.

    Q : 두 개의 관리되는 x86/x64 dll을 PInvoke가없는 하나의 관리되는 AnyCpu dll에 결합 할 수있는 방법이 있습니까?

+0

내가 아는 한 x86을 참조하면 컴파일 된 대상이 x86과 x64에서 모두 실행될 수 있습니다. 나는 심지어 당신이 AnyCpu와 x86뿐만 아니라 당신의 프로젝트를 컴파일 할 수 있다고 생각한다. 그러나 나는 완전히 확신하지 못한다. – gilmishal

+0

@gilmishal : 테스트되지는 않았지만 ... 많은 경우 x86은 좋은 기본값입니다. 그러나 제 3 자 라이브러리는 대용량 파일/데이터 세트에서 작동하므로 64 비트는 실제 이점을 제공합니다. –

답변

3

예, 있습니다. 나는 LibZ을 사용하여 관리 모드 AnyCPU 어셈블리에 혼합 모드 어셈블리를 리소스로 성공적으로 패키징했습니다. 라이브러리는 실행되는 플랫폼에 적합한 어셈블리를 선택합니다.

동일한 작성자가 lz4net에서 사용하는 기술입니다.

귀하의 경우 명령 행은 다음과 같습니다 libz

주입 - DLL --assembly YourAnyCpuLib.dll --include FooManaged.x86.dll --include FooManaged.x64.dll

주의 사항 AnyCPU 어셈블리는 여전히 플랫폼 종속 라이브러리 중 하나를 참조해야하므로 빌드시 경고가 표시됩니다. 테스트/개발 목적으로 사용중인 것을 선택하십시오.

또한 제 3 자 라이센스가 어셈블리를 사용자 고유의 것으로 포함시키는 것을 금지하지 않는지 확인하십시오.

+0

내 특정 시나리오에서는 의존성이 복잡하고 (심지어 관리되지 않는 정적 라이브러리 포함) 끔찍한 상태 (x86 dll이 전혀 작동하지 않는다는 것을 알게되었습니다)로 밝혀졌습니다. Costura와 LibZ는 정적 인 관리되지 않는 항목을 지원하지 않습니다 (AssemblyResolve는 호출되지 않습니다). 간단한 시나리오의 경우이 방법이 유용 할 것입니다. –