Это все 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.
Так что я думаю, что у меня есть следующие варианты:
- перенести все на C# и наслаждаться простотой (это занимает много времени, но просто)
- переместить C ++ / DLL CLI из основного решения и просто сохраните ссылку или создайте пакет nuget
- напишите еще одну оболочку 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, но мне понадобилось несколько дней, чтобы продолжить работу над ней.