C#調C++生成的dll報0x800736B1錯誤

這個錯誤看上去好像是 C++ DLL庫自己的問題,其實並不盡然。因爲使用了混合模式編譯託管 DLL ,因此該 DLL 又會用到非託管的 CRT ( C Run-Time )庫。若是機器上沒有安裝這些被使用到的運行時組件,就會產生相似 HRESULT: 0x8007 的錯誤。

       要注意的是,若是你編譯 C++ 託管程序集的時候使用的是 Debug 配置的話,生成的 DLL 須要調用的就是 CRT 對應的 debug 版本( msvcr80d.dll 及 msvcm80d.dll 等 )而不是(msvcm80.dll及 msvcp80.dll等)。瞭解生成的 DLL 究竟是 Debug 仍是 Release 版本最簡單的方法是用文本編輯器打開該 DLL 文件,找到如下相似的內容(通常位於文件末尾處):redis

<assembly xmlns="urn:schemas-microsoft-com:asm.v1"    編輯器

  1.           manifestVersion="1.0">  
  2.   <dependency>  
  3.     <dependentAssembly>  
  4.       <assemblyIdentity type="win32"    
  5.                         name="Microsoft.VC80.DebugCRT"    
  6.                         version="8.0.50608.0"    
  7.                         processorArchitecture="x86"    
  8.                         publicKeyToken="1fc8b3b9a1e18e3b">  
  9.       </assemblyIdentity>  
  10.     </dependentAssembly>  
  11.   </dependency>  
  12. </assembly>  
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"manifestVersion="1.0"><dependency><dependentAssembly><assemblyIdentity type="win32"name="Microsoft.VC80.DebugCRT"version="8.0.50608.0"processorArchitecture="x86"publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity></dependentAssembly></dependency></assembly>

 

若是看到 Microsoft.VC80.DebugCRT ,那說明該 dll Link的目標是 CRT的Debug版本,若是是Microsoft.VC80.CRT 則 link 到再分發版本。當我在 VS.net2005 的 IDE 中經過批生成來生成 C# exe 和 C++ dll 的時候,若是當前的活動解決方案配置是 Debug 的話,在 C# 項目的Release輸出目錄下拷貝的會是 C++ dll 的 Debug 版本文件而不是 Release 版本!因此在發佈生成以後確認對應文件的版本仍是至關有必要的。spa

下面是兩種模式須要的文件及目錄位置,根據模式將相應的文件拷入安裝目錄便可解決上述問題.net

狀態 : Debug Modedebug

     \Microsoft Visual Studio 8\VC\redist\Debug_NonRedist\x86xml

          |
          -> \Microsoft.VC80.DebugCRT
               |
               -> Microsoft.VC80.DebugCRT.manifest, msvcm80d.dll, msvcp80d.dll, msvcr80d.dll
  狀態 : Relsase Mode
     
     \Microsoft Visual Studio 8\VC\redist\x86
         
          |
          -> \Microsoft.VC80.CRT
               |
               -> Microsoft.VC80.CRT.manifest, msvcm80.dll, msvcp80.dll, msvcr80.dllget

如何生成Release 版本:it

     將運行按鈕右邊的解決方案配置改成Release模式,而後生成便可io

相關文章
相關標籤/搜索