У меня есть управляемый проект C# (таргетинг на любой процессор), который ссылается на неуправляемую DLL на C++. Я хочу развернуть мой проект C# как любой процессор, но у моей 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;
}
Работает отлично подходит для моих потребностей; могут потребоваться настройки для ваших! Приветствия, все.