溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于C#的Metro工程如何引用C++的動態(tài)庫——FIleNotFound解決辦法

發(fā)布時間:2020-07-18 08:39:06 來源:網(wǎng)絡(luò) 閱讀:3052 作者:卡卡度 欄目:開發(fā)技術(shù)

    這是個折磨了我兩天的難題,每每在我感覺找到問題所在的時候,又總是差了那么一點兒揭開謎底。

    過程是這樣的:我有個C#寫的metro風(fēng)格的工程,其中引用了C++的dll,我們知道C#是不能直接調(diào)用C++的類庫,所以需要封裝一個wrapper層,也就是個運(yùn)行時組件(WinRT Component)。詳見這里:http://msdn.microsoft.com/en-us/library/windows/apps/hh541569(v=vs.110).aspx

    我在x86架構(gòu)下編譯運(yùn)行正常。隨后我希望能編譯個ARM版本,跑在Surface上面。并且,我需要將生成Component的工程從solution里移除,這樣,就相當(dāng)于我只為別人提供一個wrapper層的dll和winmd文件,別人即可編寫自己的APP調(diào)用我的C++庫了。

    我把winRT Component工程移除,并且在configuration manager中將編譯target改為arm,此時需要在Project菜單中將winRT Component工程生成的winmd文件加入到reference中。我通過點擊Browse的方式找到winmd位置并添加。此時,編譯正常。但是問題來了:當(dāng)我remote debug到Surface上的時候,一旦調(diào)用到wrapper層的接口,就會報出“FileNotFound,找不到指定模塊”的異常。

    開始我懷疑dll沒有加載成功,可是查看了APPx文件夾,里面是已經(jīng)正確copy了dll的。并且如果再次向工程中添加一個dll時,會提示沖突,這說明dll已經(jīng)加載進(jìn)來了。

    經(jīng)測試,如果再將winRT Component工程添加到solution,然后先移除原來已經(jīng)添加的reference,再選擇“add reference —— 選擇solution--Projects”,然后勾選winRT Component工程,點擊OK。此時相當(dāng)于從solution中添加了winRT Component工程的引用。這樣,遠(yuǎn)程調(diào)試是沒有問題的。

    于是我對比了這兩次(一次成功,一次失敗)的manifest文件,發(fā)現(xiàn)成功的那次比失敗的多了這么一句:

  <Dependencies>

    <PackageDependency Name="Microsoft.VCLibs.110.00.Debug" MinVersion="11.0.50727.1" />

  </Dependencies>

也就是說因為沒有這個PackageDependency 才導(dǎo)致調(diào)試失敗,而缺少的是Microsoft.VCLibs.110.00.Debug,也就是說系統(tǒng)庫缺失!

隨后回到工程“add reference —— 選擇windows--Extensions——勾選Microsoft Visusl C++ Runtime Package”,確定,重新編譯。問題解決!

回頭分析了一下這個問題:問題雖小,一個勾選就能解決,但是查起來卻著實不易。主要是對C#比較陌生,而且Metro程序玩的太少。

http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/ed405c8c-c650-4c36-aaae-d81620de62c8/  這里有篇文章給了很大啟示,其中Rob的回答中說Microsoft.VCLibs.110.00.Debug這個庫是C++和JS工程需要的。如果你的工程是C++或JS的,那么VS會自動幫你加上這個庫,而C#的工程是不需要的,所以VS默認(rèn)不會幫你加上(這也是我之前成功和失敗兩次manifest文件差別的原因)。由于我的APP是C#的,所以VS沒有幫我加這個庫,但是又由于我調(diào)用了C++的dll,所以必須要這個庫才可以調(diào)試,因此導(dǎo)致了這一錯誤。望以后碰到類似問題的同學(xué)能注意到這點。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI