簡體   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