带有本地代码DLL的Excel 2016 VSTO插件

使用来自第三方的SDK创buildExcel插件。 SDK包含一个本地代码DLL(32位和64位版本)。 我的插件代码是在C#中,看来只有在“AnyCPU”选项下编译才能运行插件。

当我尝试运行应用程序,我得到“试图加载一个不正确的格式的程序(从HRESULTexception:0x8007000B)”这通常意味着一个64/32不匹配,错误是从试图加载第三第三方本地代码DLL。

我的问题是:我的假设是正确的关于AnyCPU,有没有一种方法可以从AnyCPU下编译的插件运行本机代码DLL? 谢谢!

.net 4.5之前的AnyCPU取决于你当前的编译机器。 如果您的机器是32位CPU,AnyCPU会将您的程序编译为32位程序。 如果是64位CPU,则会编译为64位。

.net 4.5之后,AnyCPU改变了:

  • 如果进程在32位Windows系统上运行,则它以32位进程运行。 IL被编译为x86机器码。
  • 如果进程在64位Windows系统上运行,则它以32位进程运行。 IL被编译为x86机器码。
  • 如果进程在ARM Windows系统上运行,则它以32位进程运行。 IL被编译为ARM机器码。

如果你想要你的程序可以同时运行32位和64位cpu,你应该将你的本地代码DLL与32位版本链接起来,否则你需要在不同的CPU中编译它们

是的,这是可能的,你可以创build一些包装函数,根据当前的体系结构将调用redirect到本地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); }