2013-07-19 64 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文件的解决方案创建)