Создание надстройки для Excel с использованием SDK от стороннего разработчика. SDK содержит DLL с собственным кодом (как в 32-, так и в 64-битной версиях). Мой код надстройки находится на C #, и кажется, что надстройки запускаются, только если они скомпилированы под опцией «AnyCPU».
Когда я пытаюсь запустить приложение, я получаю сообщение «Была предпринята попытка загрузить программу с неправильным форматом. (Исключение из HRESULT: 0x8007000B)», что обычно означает несоответствие 64/32, и ошибка связана с попыткой загрузить 3-й партийный нативный код DLL.
Мой вопрос: верны ли мои предположения относительно AnyCPU и есть ли способ запустить библиотеки DLL с собственным кодом из надстройки, скомпилированной под AnyCPU? Спасибо!
до .net 4.5 AnyCPU зависит от вашего текущего компилятора.
если ваша машина имеет 32-битный процессор, AnyCPU скомпилирует вашу программу как 32-битную. если это 64-битный процессор, он будет скомпилирован как 64-битный.
после .net 4.5 AnyCPU изменился:
Если вы хотите, чтобы ваша программа могла работать как с 32-битным, так и с 64-битным процессором, вам следует связать вашу DLL с собственным кодом с 32-битной версией, в противном случае вам нужно скомпилировать их в отдельных процессорах.
Да, это возможно, вы можете создать некоторые функции-обертки, которые перенаправляют вызов на собственную dll в зависимости от текущей архитектуры, например:
[DllImport("bin32\\Native86Dll", EntryPoint = "MyFunc", CharSet = CharSet.Ansi, ExactSpelling = true)]
public static extern int MyFunc_32(string sCommand);
[DllImport("bin64\\Native64Dll", EntryPoint = "MyFunc", CharSet = CharSet.Ansi, ExactSpelling = true)]
public static extern int MyFunc_64(string sCommand);
public static int MyFunc(string sCommand )
{
return System.Environment.Is64BitProcess ? MyFunc_64(sCommand) : MyFunc_32(sCommand);
}