添加" winmd" reference vs添加项目引用

时间:2013-07-19 12:59:39

标签: c# .net visual-studio visual-studio-2012 windows-phone-8

我有一个Windows Phone 8项目和另一个用C ++编写的项目;两者都在同一个解决方案中。 C ++项目是WP8项目中使用的动态库,它被配置为在.winmd文件之上生成Windows Metada文件(.dll)。

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

3 个答案:

答案 0 :(得分:1)

工具+选项,项目和解决方案,构建和运行。将“MSBuild项目构建输出详细程度”设置更改为“正常”。

注意构建输出,以及在“XapPackager”之后看到的消息。其中显示哪些文件被添加到Xap包中。您的DLL需要在该列表中。如果不是,那么您的程序将如所描述的那样失败。在这种情况下,您需要找出它被跳过的原因。通过检查.winmd引用的Copy Local属性是否为True来启动它。

答案 1 :(得分:0)

好吧,我设法让它发挥作用。正如原帖中的堆栈跟踪所暗示的那样,我在我的应用程序中使用了SQLite。如果我将winmd文件添加为引用而不是C ++项目,则看起来似乎不满足某些依赖项。

因此,我必须在SQLite for Windows Phone项目中添加对WP8ClassLibrary的引用。这在某种程度上是我的一个愚蠢的错误,因为这个C ++项目可能带有这种依赖关系(其中有几个winmd引用,但我无法猜测它们会成为{{{ 1}}基于他们晦涩的名字)。

答案 2 :(得分:0)

我只想将自己的经验添加到答案中。

如果您尝试将C ++库直接添加到C#代码(对于我的案例中的Windows Phone 8.1应用程序),则包含.winmd文件会启用编译,但应用程序会在启动时崩溃。堆栈跟踪仅表示无法加载C ++ DLL。

我还必须在C#应用程序中添加对Visual Studio C ++运行时库的引用。我通过区分工作.xap(从包含C#和C ++项目的解决方案创建)和非工作.xap(从仅包含C#项目的解决方案创建以及引用C ++ .winmd文件)来发现缺少的引用。