簡體   English   中英

添加“winmd”引用與添加項目引用

[英]Adding a “winmd” reference vs Adding a project reference

我有一個Windows Phone 8項目和另一個用C ++編寫的項目; 兩者都在同一個解決方案中。 C ++項目是WP8項目中使用的動態庫,它被配置為在.dll文件之上生成Windows Metada文件( .winmd )。

在WP8項目中將C ++項目添加為項目引用時,一切都運行良好。

但是,我想直接引用二進制文件而不是項目,所以我嘗試引用.dll本身,但VS2012不會讓我(我完全理解,因為庫不受我理解的管理)。 添加.winmd文件代替工作,我的意思是它編譯沒有警告/錯誤; 但它在運行時崩潰(我得到一個TargetInvocationException ,因為無法找到C ++庫的“實際”代碼而引發)。

添加.winmd文件時,我確保.dll文件就在它旁邊。 將這兩個文件放在WP8項目的bin目錄中也不起作用。

我在互聯網上找不到任何線索,如果你能給我一些,我將不勝感激,歡迎任何提示!

這是我正在嘗試設置的簡單架構的架構:

建築

這是引發異常的堆棧跟蹤:

at System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD)
   at Sqlite.Sqlite3.sqlite3_open_v2(String filename, Database& db, Int32 flags, String zVfs)
   at SQLite.SQLite3.Open(String filename, Database& db, Int32 flags, IntPtr zVfs)
   at SQLite.SQLiteConnection..ctor(String databasePath, SQLiteOpenFlags openFlags, Boolean storeDateTimeAsTicks)
   at SQLite.SQLiteConnection..ctor(String databasePath, Boolean storeDateTimeAsTicks)
   at WP8ClassLibrary.SomeManager..ctor(String databasePath)
   at WP8App.SomeViewModel..ctor()
   at WP8App.MainPage..ctor()

工具+選項,項目和解決方案,構建和運行。 將“MSBuild項目構建輸出詳細程度”設置更改為“正常”。

注意構建輸出,你在“XapPackager”之后看到的消息。 其中顯示哪些文件被添加到Xap包中。 您的DLL需要在該列表中。 如果不是,那么您的程序將如所描述的那樣失敗。 在這種情況下,您需要找出它被跳過的原因。 通過檢查.winmd引用的Copy Local屬性是否為True來啟動它。

好吧,我設法讓它工作。 正如原帖中的堆棧跟蹤所暗示的那樣,我在我的應用程序中使用了SQLite。 如果我將winmd文件添加為參考而不是C ++項目,則看起來似乎不滿足某些依賴項。

因此,我必須在WP8ClassLibrary項目中添加對SQLite for Windows PhoneWP8ClassLibrary 這在某種程度上是我的一個愚蠢的錯誤,因為這個C ++項目可能帶有這種依賴關系(其中有幾個winmd引用,但我不能猜測它們將成為基於其模糊名稱的SQLite for Windows PhoneSQLite for Windows Phone一部分)。

我只是想把我的經驗添加到答案中..

如果您嘗試將C ++庫直接添加到C#代碼(對於我的案例中的Windows Phone 8.1應用程序),則包含.winmd文件將啟用編譯,但應用程序在啟動時崩潰。 堆棧跟蹤僅表示無法加載C ++ DLL。

我還必須在C#應用程序中添加對Visual Studio C ++運行時庫的引用。 我通過區分工作.xap(從包含C#和C ++項目的解決方案創建)和非工作.xap(從僅包含C#項目的解決方案創建以及引用C ++ .winmd文件)來發現缺少的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM