мы используем самозаписанный C++ на 32 бита DLL из наших приложений C#. Теперь мы заметили, что, когда приложения C# запущены в системе на 64 бита, время выполнения на 64 бита автоматически используется, и конечно к DLL на 32 бита нельзя получить доступ от времени выполнения на 64 бита.
Мой вопрос: существует ли способ использовать DLL на 32 бита? В противном случае, если бы я создал версию на 64 бита DLL, то было бы легко возможно позволить приложению выбрать который к P/Invoke к?
Я думаю о создании двух классов помощника в C#: Тот, который импортирует функции из DLL на 32 бита и того, который импортирует из DLL на 64 бита, затем создавая класс обертки с одной функцией для каждой импортированной функции, которая называет или средство импорта на 32 бита или средство импорта на 64 бита в зависимости от "крошечности" ОС. Это работало бы?
Или есть ли другой простой способ сделать вещи?
Убедитесь, что вы используете вызовы P / Invoke только для 64-битной библиотеки DLL при компиляции в 64-битной среде.
Один из вариантов - переместить все ваши «методы» в стандартный интерфейс (или абстрактный базовый класс) и предоставить 2 реализации, одну 32-битную и одну 64-битную. У вас может быть фабричный метод для создания соответствующего экземпляра класса в зависимости от размера IntPtr.
Это позволяет приложению "AnyCPU" правильно во время выполнения определять, в какую DLL нужно выполнить P / Invoke, и действительно работает.
Вы можете пометить приложение .Net только для целевой архитектуры x86
У меня было аналогичная проблема, но это было с 32-битной или 64-битной Unrar.dll.
Есть два подхода, чтобы заставить его работать:
a)
#if x64
// ... define all x64 imports here
#else
// ... define all x86 imports here
#endif
И скомпилировать приложение для 32-битной и 64-битной версии.
б) Другой способ заключался в создании интерфейса для импорта и реализации 32-битной и 64-битной версий отдельно.
Если 32-битный, создайте экземпляр 32-битной реализации, иначе создайте экземпляр 64-битной реализации.
Создайте вспомогательный класс, который объединяет как 64-битные, так и 32-битные библиотеки DLL, и используйте IntPtr.Size, чтобы определить, какой из них вызывать.
if (IntPtr.Size == 8)
{
Helper.SomeMethod64();
}
else
{
Helper.SomeMethod32();
}