관리되지 않는 C++ DLL을 참조하는 관리되는 C# 프로젝트 (모든 CPU 대상)가 있습니다. C# 프로젝트를 Any CPU로 배포하려고하지만 C++ DLL에 Any CPU 옵션이 없습니다. 내 C++ DLL은 ARM, Win32 및 x64 플랫폼 만 대상으로 할 수 있습니다. 편의상 모든 프로젝트를 C# 프로젝트와 동일한 디렉터리에 구축하고 C# 프로젝트에서 동적으로 참조하도록하고 싶습니다. 내 출력 디렉토리에 ARM, Win32 및 x64 버전의 관리되지 않는 DLL이 포함되어 있습니다. 그렇다면 어떻게하면 내 솔루션이 동일한 프로젝트에 대해 여러 플랫폼 대상을 만들 수 있습니까?같은 프로젝트에서 여러 플랫폼 대상을 한 번에 빌드
1
A
답변
1
내가 원하는 것에 대한 해결책을 찾았습니다.
먼저해야 할 일은 프로젝트 파일에서 MSBuild를 사용하여 다른 플랫폼에서 DLL을 빌드하는 것입니다. 내 솔루션에는 x64로 빌드 된 프로젝트가 있으므로 추가 빌드 후 단계로 x86 버전을 빌드해야하므로이 프로세스를 용이하게하기 위해 관리되는 C# 프로젝트에 포스트 빌드 스크립트를 추가했습니다.
del "$(TargetDir)Unmanaged_x64.dll"
ren "$(TargetDir)Unmanaged.dll" Unmanaged_x64.dll
del "$(TargetDir)Unmanaged_x86.dll"
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" "$(SolutionDir)Unmanaged\Unmanaged.vcxproj" /p:Configuration=$(ConfigurationName) /p:Platform=x86
copy "$(SolutionDir)Unmanaged\$(ConfigurationName)\Unmanaged.dll" "$(TargetDir)Unmanaged_x86.dll"
이제 내 C# 응용 프로그램에서, 나는 나의 App.xaml.cs
파일에 조립 해결이 :
protected override void OnStartup(StartupEventArgs e)
{
...
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
...
}
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name == "Unmanaged, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")
{
if (Environment.Is64BitOperatingSystem)
{
return Assembly.LoadFrom(String.Format("{0}\\{1}", AppDomain.CurrentDomain.BaseDirectory, "Unmanaged_x64.dll"));
}
else
{
return Assembly.LoadFrom(String.Format("{0}\\{1}", AppDomain.CurrentDomain.BaseDirectory, "Unmanaged_x86.dll"));
}
}
return null;
}
내 요구에 좋은 작품; 당신의 개조가 필요할 수 있습니다! 건배, 모두들.