Оболочка AnyCPU для сборки C ++ / CLI (смешанная) - PullRequest
0 голосов
/ 23 марта 2020

Это все TLDR, сделано так коротко, как я мог.

У меня есть c# настольное приложение WPF, где я использую некоторую устаревшую библиотеку C ++ через управляемую оболочку C ++, созданную для x64 и Win32. Все работает отлично и сэкономило мне много времени на портирование. В то же время это вызвало некоторую неловкость в проекте, где у меня сейчас 90% кода C#. Часть C ++ больше не изменяется, она поддерживает некоторые «старые вещи».

Управляемый C ++ имеет конфигурации Win32 и x64, а остальная часть кода имеет x64, x86 и AnyCPU. В диспетчере конфигурации всегда есть некоторые проблемы (Visual Studio 2017). Я не могу использовать сборку AnyCPU, потому что наличие управляемого кода требует определенной c версии DLL, поэтому мне нужно собрать всю рабочую область как x86 / Win32 или x64.

Так что я думаю, что у меня есть следующие варианты:

  1. перенести все на C# и наслаждаться простотой (это занимает много времени, но просто)
  2. переместить C ++ / DLL CLI из основного решения и просто сохраните ссылку или создайте пакет nuget
  3. напишите еще одну оболочку AnyCPU, которая динамически загружает версию DLL для x64 или Win32

Я нашел много постов о микшировании C ++ / C#, но не под таким углом. Итак, я думаю об обёртке по этим направлениям:

        String path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        path = Path.Combine(path, (IntPtr.Size == 4) ? "x86" : "x64");
        path = Path.Combine(path, "legacy.dll");

        Assembly assembly = Assembly.LoadFrom(path);
        dynamic wrapped = assembly.CreateInstance("LegacyStuff.SomeClass");
        // now use the type

Устаревшие библиотеки DLL обёрток C ++ могут быть помещены в относительный каталог (один для x64, один для x68), и мы загружаем тот, который соответствует текущей платформе. Очевидно, что «LegacyStuff.SomeClass» из DLL x64 и x86 - это разные типы, поэтому их можно будет использовать только как тип Dynami c. К сожалению, классы в библиотеке C ++ имеют довольно сложный интерфейс с множеством свойств и методов.

Редактировать: я уже видел более актуальную информацию об SO, но мне понадобилось несколько дней, чтобы продолжить работу над ней.

...