Вот ситуация, я использую dll на основе C в своем приложении dot.net. Есть 2 библиотеки DLL, один из которых 32 бит называется MyDll32.dll, а другой - 64-битная версия под названием MyDll64.dll.Использование 32-битной или 64-битной dll в C# DllImport
Существует статическая переменная, содержащая имя файла DLL: string DLL_FILE_NAME.
и используется следующим образом:
[DllImport(DLL_FILE_NAME, CallingConvention=CallingConvention.Cdecl, EntryPoint=Func1")]
private static extern int is_Func1(int var1, int var2);
Простой до сих пор.
Как вы можете себе представить, программное обеспечение скомпилировано с включенным «Any CPU».
У меня также есть следующий код, чтобы определить, должна ли система использовать 64-битный файл или 32-битный файл.
#if WIN64
public const string DLL_FILE_NAME = "MyDll64.dll";
#else
public const string DLL_FILE_NAME = "MyDll32.dll";
#endif
Теперь вы должны увидеть проблему .. DLL_FILE_NAME определяется время компиляции, а не во время выполнения, так что правая длл не загружена в соответствии с контекстом исполнения.
Что было бы правильным способом справиться с этой проблемой? Я не хочу два файла исполнения (один для 32-битного, а другой для 64-битного)? Как я могу установить DLL_FILE_NAME до, он используется в инструкции DllImport?
В чем разница между 64-битной и 32-разрядной dll? Есть ли что-то, что 32-битное не может сделать на 64? Если так, я бы просто использовал 32. –
На 64-битной ОС решение о выполнении кода в чистом 64-битном или WOW64 (32-разрядном эмулированном) определяется при выполнении программы. Если программа выполняется в 32-битном режиме, она должна использовать dll, основанные на C, которые были скомпилированы соответственно на 32 и 64 бит. – Gilad
Если вы действительно этого хотите, вам нужно обойти атрибут 'DllImport' и загрузить DLL самостоятельно, используя функции LoadLibrary', GetProcAddess' и' FreeLibrary'. Этот метод обсуждается [здесь] (http://stackoverflow.com/questions/2818011/set-dllimport-attribute-dynamically). Однако это довольно честная работа, и довольно просто ошибиться. Предоставление механизма P/Invoke для вас намного проще. Как отмечали другие, вероятно, этого не стоит, если вы можете просто вернуться к 32-разрядной DLL все время как самый низкий общий знаменатель. –