У меня есть управляемый проект С# (таргетинг на любой процессор), который ссылается на неуправляемую DLL C++. Я хочу развернуть мой проект С# как любой процессор, но у моей C++ DLL нет опции Any CPU. Моя C++ DLL может ориентироваться только на платформы ARM, Win32 и x64. Для удобства я хотел бы построить все те, которые были в том же каталоге, что и мой проект С#, и иметь ссылку на проект С# на их динамическом уровне; Я хотел бы, чтобы мой выходной каталог содержал ARM, Win32 и x64 версии моей неуправляемой библиотеки DLL. Таким образом, как я могу сделать свое решение для сборки нескольких платформ для одного и того же проекта?
Я нашел обходной путь к тому, что я хочу.
Первое, что вам нужно сделать, это использовать MSBuild в файле проекта, чтобы создать DLL под другой платформой. Мое решение имеет мое проектное здание как x64, поэтому мне нужно создать версию x86 в качестве дополнительного этапа после сборки, поэтому я добавил, что я добавил сценарий пост-сборки для моего управляемого проекта С#, чтобы облегчить этот процесс:
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"
Теперь, в моем приложении С#, у меня есть сборщик в моем файле 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;
}
Отлично подходит для моих нужд; могут потребоваться настройки для вас! Приветствия, все.