.net2.0中調用非託管組件出現的問題及其解決方案.

來源:互聯網
上載者:User

VS2005的bug還是多...今天又被我找著一個.
在今天寫的另一篇文章 .net組件調用VC組件時的資料類型問題. 中,我自己封裝了一個.net組件,這個組件通過與一個在VC6下寫的dll進行通訊來方便的給.net程式提供服務,實際上,我寫了一個控制台項目來進行測試,效果非常好,沒有任何問題,於是把這個組件發布到公司內部使用,結果麻煩就來了…

一個同事來找我,告訴我那個組件不能使用,說是找不到指定的模組.我的第一反應是:肯定是漏拷了vc的運行庫.
結果一看,是如下的一個出錯提示:

提示上聲稱缺少的dll是個在VC6下編譯產生的dll,也就是說,是非託管的.這裡非常奇怪,因為我明明把所有的dll都放到了bin目錄下,怎麼會提示找不到dll呢?之間的引用本來就是通過相對路徑引用的啊.很納悶,回到自己機子上調試,直到這時我還在懷疑是不是VC6運行庫的問題,建立一個web項目(同事就是web項目出錯了),運行,嘿,果然出錯了,看來真不是運行庫的問題了,那問題是出在哪呢?引用的問題嗎?但是非託管的dll是不能添加引用的.直覺告訴我,問題可能是在這.
開始google,呵,看來出這個問題的還不少,只不過都是國外的.點了forums.asp.net的一個文章(http://forums.asp.net/thread/1121085.aspx)查看.看完之後茅塞頓開.

PS:這個問題只在web項目中可能出現,原因下面將解釋.
這個問題最常出現在使用ThirdParty組件的時候,我的也同樣是這時出的問題,Asp.Net Team的官方解決方案如下:

首先需要確認你引用了哪些組件,那些是託管的,哪些是非託管的.託管的很好辦,直接被使用的需要引用,間接使用的需要拷貝到bin目錄下.非託管的處理會比較麻煩.實際上,你拷貝到bin沒有任何協助,因為CLR會把檔案拷貝到一個臨時目錄下,然後在那運行web,而CLR只會拷貝託管檔案,這就是為什麼我們明明把非託管的dll放在了bin下卻依然提示不能載入模組了.
具體做法如下:
首先我們在伺服器上隨便找個地方建立一個目錄,假如為C:\DLL

然後,在環境變數中,給Path變數添加這個目錄

最後,把所有的非託管檔案都拷貝到C:\DLL中.
OK,去運行吧,沒問題了吧?(注意,運行之前,需要重啟VS,如果使用IIS,那就需要重啟IIS)

嗯,其實這並不是什麼官方做法,實在是現在的情況下,只能如此處理而已,據說該bug已經被提交到CLR Team了,希望微軟能針對這個問題儘快推出補丁.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.