[英]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 Phone
的WP8ClassLibrary
。 這在某種程度上是我的一個愚蠢的錯誤,因為這個C ++項目可能帶有這種依賴關系(其中有幾個winmd
引用,但我不能猜測它們將成為基於其模糊名稱的SQLite for Windows Phone
的SQLite 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.