Excel 2016 VSTO 加载项与本机代码 DLL



使用来自第三方的SDK创建Excel插件。SDK 包含一个本机代码 DLL(32 位和 64 位版本(。我的插件代码是 C# 的,似乎插件只有在"AnyCPU"选项下编译时才运行。

当我尝试运行该应用程序时,我得到"尝试加载格式不正确的程序。(HRESULT的例外: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 中编译它们

是的,这是可能的,您可以创建一些包装器函数,根据当前体系结构将调用重定向到本机 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);
        }

最新更新