繁体   English   中英

Excel 2016 VSTO Addin与本机代码DLL

[英]Excel 2016 VSTO Addin With Native Code DLL

使用来自第三方的SDK创建Excel插件。 SDK包含本机代码DLL(32位和64位版本)。 我的插件代码在C#中,并且看起来只有在“AnyCPU”选项下编译时才会运行插件。

当我尝试运行应用程序时,我得到“尝试加载格式不正确的程序。(HRESULT异常:0x8007000B)”这通常意味着64/32不匹配,错误来自于尝试加载第3个派对本机代码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);
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM