8

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

在 WP8 项目中添加 C++ 项目作为项目参考时,一切正常。

但是,我想直接引用二进制文件而不是项目,所以我尝试引用它.dll本身,但 VS2012 不会让我(我完全理解,因为我理解的库是不受管理的)。添加.winmd文件而不是工作,我的意思是它编译时没有警告/错误;但它在运行时崩溃(我得到一个TargetInvocationException因为找不到 C++ 库的“实际”代码而引发的问题)。

添加.winmd文件时,我确保.dll文件在它旁边。将这两个文件放在binWP8 项目的目录中也不起作用。

我在互联网上找不到任何线索,如果您能给我一些线索,我将不胜感激,欢迎任何提示!

这是我正在尝试设置的简单架构的架构:

建筑学

这是引发的异常的堆栈跟踪:

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

3 回答 3

1

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

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

于 2013-07-19T13:53:16.130 回答
1

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

如果您尝试将 C++ 库直接添加到 C# 代码(在我的例子中是 Windows Phone 8.1 应用程序),那么包含 .winmd 文件会启用编译,但应用程序在启动时会崩溃。堆栈跟踪只说加载 C++ dll 失败。

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

于 2016-02-12T06:13:04.477 回答
0

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

因此我不得不SQLite for Windows PhoneWP8ClassLibrary项目中添加一个引用。这在某种程度上是我的一个愚蠢的错误,因为这个 C++ 项目可能本身就带有这种依赖关系(其中有几个winmd引用,但我无法猜测它们会成为SQLite for Windows Phone基于其晦涩名称的一部分)。

于 2013-07-19T15:15:26.803 回答