2013-07-19 62 views
7

我有一個Windows Phone 8項目和用C++編寫的另一個項目;兩者都在相同的解決方案。 C++項目是WP8項目中使用的動態庫,它被配置爲在.dll文件的頂部生成Windows Metada文件(.winmd)。添加「winmd」引用vs添加項目引用

在WP8項目中添加C++項目作爲項目引用時,一切都很好。但是,我想直接引用二進制文件而不是項目,所以我嘗試引用.dll本身,但VS2012不會讓我(我完全理解,因爲圖書館是從我理解的非託管的)。添加.winmd文件,而不是工作,我的意思是編譯沒有警告/錯誤;但它在運行時崩潰(我得到TargetInvocationException這是因爲C++庫的「實際」代碼找不到)。

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

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

這裏是微不足道的架構的模式,我想設置:

architecture

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

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() 

回答

0

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

因此,我不得不將SQLite for Windows Phone的引用添加到WP8ClassLibrary項目中。這是我的一個愚蠢的錯誤,因爲這個C++項目可能本身(這裏有幾個winmd引用,但我不能猜到它們將基於它們的模糊名稱是SQLite for Windows Phone的一部分)。

1

工具+選項,項目和解決方案,構建和運行。將「MSBuild項目生成輸出詳細信息」設置更改爲正常。

請注意構建輸出,您在「XapPackager」之後看到的消息。其中顯示哪些文件正在添加到Xap軟件包中。您的DLL需要在該列表中。如果不是那麼你的程序將會按照描述的那樣失敗。在這種情況下,你需要找出爲什麼它被跳過。首先檢查.winmd引用的Copy Local屬性是否爲True。

+0

謝謝您的回答。 Copy Local屬性設置爲true;並且在'Begin Xap packaging'之後,'winmd'和'all'文件都顯示在列表中。我簡化了一些原來的帖子,我有一個生成'dll'和'winmd'的C++文件,這個'winmd'用於WP8類庫項目中,該項目生成用於「具體」WP8項目的'dll'。在構建過程中正確複製了兩個'dll'和'winmd'文件。 – Max

+0

你不幫我幫你。 「全部文件?兩個dll?您現在有辦法診斷兩種方法之間的不同之處,但沒有提及任何方法。我沒有詳細的例外信息來查看。如果你不能更好地記錄它,我必須推薦一個項目參考。 –

+0

對不起,我的意思是「'winmd'和'dll'文件」,我的手指不知何故滑到'a'鍵... – Max

0

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

如果你想增加一個C++庫,直接到C#代碼(在我的情況了Windows Phone 8.1的應用程序),然後包括.winmd文件啓用編譯,但應用程序在啓動時崩潰。堆棧跟蹤僅說未能加載C++ dll。

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