C#: Доступ 32-bit/64-bit DLL в зависимости от платформы

мы используем самозаписанный C++ на 32 бита DLL из наших приложений C#. Теперь мы заметили, что, когда приложения C# запущены в системе на 64 бита, время выполнения на 64 бита автоматически используется, и конечно к DLL на 32 бита нельзя получить доступ от времени выполнения на 64 бита.

Мой вопрос: существует ли способ использовать DLL на 32 бита? В противном случае, если бы я создал версию на 64 бита DLL, то было бы легко возможно позволить приложению выбрать который к P/Invoke к?

Я думаю о создании двух классов помощника в C#: Тот, который импортирует функции из DLL на 32 бита и того, который импортирует из DLL на 64 бита, затем создавая класс обертки с одной функцией для каждой импортированной функции, которая называет или средство импорта на 32 бита или средство импорта на 64 бита в зависимости от "крошечности" ОС. Это работало бы?

Или есть ли другой простой способ сделать вещи?

5
задан Thorsten Dittmar 4 March 2010 в 10:33
поделиться

4 ответа

Убедитесь, что вы используете вызовы P / Invoke только для 64-битной библиотеки DLL при компиляции в 64-битной среде.

Один из вариантов - переместить все ваши «методы» в стандартный интерфейс (или абстрактный базовый класс) и предоставить 2 реализации, одну 32-битную и одну 64-битную. У вас может быть фабричный метод для создания соответствующего экземпляра класса в зависимости от размера IntPtr.

Это позволяет приложению "AnyCPU" правильно во время выполнения определять, в какую DLL нужно выполнить P / Invoke, и действительно работает.

6
ответ дан 13 December 2019 в 19:25
поделиться

Вы можете пометить приложение .Net только для целевой архитектуры x86

1
ответ дан 13 December 2019 в 19:25
поделиться

У меня было аналогичная проблема, но это было с 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-битной реализации.

1
ответ дан 13 December 2019 в 19:25
поделиться

Создайте вспомогательный класс, который объединяет как 64-битные, так и 32-битные библиотеки DLL, и используйте IntPtr.Size, чтобы определить, какой из них вызывать.

if (IntPtr.Size == 8)
{
    Helper.SomeMethod64();
}
else
{
    Helper.SomeMethod32();
}
3
ответ дан 13 December 2019 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: