熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

調用非托管dll常出現的bug及解決辦法

2013-11-13 10:41:12  來源: .NET編程 

  C和C++有很多好的類庫的沉澱NET中完全拋棄它們而重頭再來是非常不明智的也是不現實的所以我們經常需要通過Pinvoke來使用以前遺留下來的非托管的dllNET中使用非托管的dll經驗而言經常碰到的問題至少有兩個它們都是通過在運行時拋出異常來體現的

  試圖加載格式不正確的程序

  出現這種異常通常是NET應用程序的“目標平台”與非托管dll的平台不一樣

  一般在使用VS開發NET的應用程序和類庫時默認的目標平台為“Any CPU”即會在運行時可根據CPU類型自動選擇X或X擁有這樣的能力是因為NET編譯後的程序集是基於IL的在運行時CLR才會將其JIT發射為X或X的機器碼

  而C或C++編譯生成的dll就是機器碼所以其平台的決策是在編譯時決定的通過編譯選項的設置我們可以將C/C++項目編譯為X的dll或者X的dll

  所以在調用了非托管dll的NET項目中也需要將其目標平台屬性設為與非托管的dll的運行平台完全一致通常遺留下來的非托管dll都是基於x所以在調用了這類非托管dll的NET項目中就將其目標平台屬性設為“X

  可根據“項目>屬性>生成>目標平台”找到該設置

調用非托管dll常出現的bug及解決辦法

  無法加載dll找不到指定的模塊

  運行調用了非托管的NET應用程序有時會出現這種異常可是比較郁悶的是這種異常並不是在所有的電腦上都會出現就經驗來說它只是在少部分電腦上出現而在絕大部分電腦上運行都是正常的我們在開發語音視頻錄制組件MFile時就遇到過這個問題當時很是頭疼

  如果出現這種情況很大的可能就是那少部分電腦上沒有安裝VC++運行時(CRT)或者是CRT安裝不正確導致的好用的解決方案有兩種

  ()在C盤下找到了下列文件msvcmddllmsvcpddllmsvcrddllMicrosoftVCDebugCRTmanifest把這幾個文件拷貝到目標機器上放到運行目錄下或放到system就可以了

  注意一般這幾個文件都有多個版本位於不同的文件夾下要觀察其文件夾的名稱是x還是x是debug的還是release的以及是否要MFC的這些選擇要與非托管dll的信息一致

  ()如果有非托管dll的源碼那就修改編譯選項重新編譯一下將/MD或/MDd 改為 /MT或/MTd這樣就實現了對VC運行時庫的靜態鏈接在運行時就不再需要上述幾個dll了


From:http://tw.wingwit.com/Article/program/net/201311/14300.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.