Построение сразу нескольких платформ для одного проекта

1

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

Теги:
visual-studio
visual-c++
platform
build

1 ответ

1

Я нашел обходной путь к тому, что я хочу.

Первое, что вам нужно сделать, это использовать 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;
}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню