C #: доступ к 32-битной / 64-битной DLL в зависимости от платформы - PullRequest
5 голосов
/ 04 марта 2010

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

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

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

Или есть еще один простой способ сделать что-то?

Ответы [ 4 ]

6 голосов
/ 13 апреля 2010

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

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

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

3 голосов
/ 09 июля 2010

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

if (IntPtr.Size == 8)
{
    Helper.SomeMethod64();
}
else
{
    Helper.SomeMethod32();
}
1 голос
/ 04 марта 2010

У меня была похожая проблема, но она была с 32-битной или 64-битной Unrar.dll.

Может быть два подхода, чтобы заставить это работать:

а)

#if x64
// ... define all x64 imports here
#else
// ... define all x86 imports here
#endif

И скомпилируйте приложение для 32-битных и 64-битных.

б) Другим способом было создать интерфейс для импорта и реализовать 32-битную и 64-битную версии отдельно.

Если 32-битная, создать экземпляр 32-битной реализации, иначе - 64-битная реализация.

1 голос
/ 04 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...