2015-01-18 9 views
1

У меня есть управляемый проект C# (таргетинг на любой процессор), который ссылается на неуправляемую DLL на C++. Я хочу развернуть мой проект C# как любой процессор, но у моей C++ DLL нет опции Any CPU. Моя C++ DLL может ориентироваться только на платформы ARM, Win32 и x64. Для удобства я хотел бы построить все те, которые были в том же каталоге, что и мой проект C#, и иметь ссылку на проект C# на их динамическом уровне; Я хотел бы, чтобы мой выходной каталог содержал ARM, Win32 и x64 версии моей неуправляемой библиотеки DLL. Таким образом, как я могу сделать свое решение для сборки нескольких платформ для одного и того же проекта?Создание нескольких целей платформы сразу для одного и того же проекта

ответ

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; 
} 

Работает отлично подходит для моих потребностей; могут потребоваться настройки для ваших! Приветствия, все.