C # — Excel 2016 VSTO Addin с DLL собственного кода

Создание надстройки для Excel с использованием SDK от стороннего разработчика. SDK содержит DLL с собственным кодом (как в 32-, так и в 64-битной версиях). Мой код надстройки находится на C #, и кажется, что надстройки запускаются, только если они скомпилированы под опцией «AnyCPU».

Когда я пытаюсь запустить приложение, я получаю сообщение «Была предпринята попытка загрузить программу с неправильным форматом. (Исключение из HRESULT: 0x8007000B)», что обычно означает несоответствие 64/32, и ошибка связана с попыткой загрузить 3-й партийный нативный код DLL.

Мой вопрос: верны ли мои предположения относительно AnyCPU и есть ли способ запустить библиотеки DLL с собственным кодом из надстройки, скомпилированной под AnyCPU? Спасибо!

1

Решение

до .net 4.5 AnyCPU зависит от вашего текущего компилятора.
если ваша машина имеет 32-битный процессор, AnyCPU скомпилирует вашу программу как 32-битную. если это 64-битный процессор, он будет скомпилирован как 64-битный.

после .net 4.5 AnyCPU изменился:

  • Если процесс выполняется в 32-разрядной системе Windows, он запускается как 32-разрядный
    процесс. IL скомпилирован в машинный код x86.
  • Если процесс продолжается
    64-битная система Windows, она работает как 32-битный процесс. IL компилируется
    на машинный код x86.
  • Если процесс выполняется в системе ARM Windows,
    он работает как 32-битный процесс. IL скомпилирован в машинный код ARM.

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

0

Другие решения

Да, это возможно, вы можете создать некоторые функции-обертки, которые перенаправляют вызов на собственную 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);
}
0

По вопросам рекламы [email protected]