3

什么有效>图书馆设置

我有一个包含 2 个项目的 Windows Phone 8 解决方案:

  • “Hello”,一个简单的库项目 -> 生成Hello.dll
  • “HelloNativeRT”,一个带有 C++ 文件的 WP 运行时组件 -> 生成HelloNativeRT.dllHelloNativeRT.winmd

在这个解决方案中,“Hello”库引用了 WP 运行时组件,所以调用...

HelloNativeRT.SampleNamespace test = new HelloNativeRT.SampleNamespace();

...在这个库项目中工作正常。

什么不起作用 > WP8 应用程序设置

但是,我想在 Windows Phone 8 应用程序中使用这两个库,但不添加对项目的引用,因为我需要将编译后的库发送给客户端。

  • 我在项目中引用了Hello.dll文件,以及HelloNativeRT.winmd文件。
  • 当我在调试模式下启动应用程序并转到 HelloNativeRT.SampleNamespace test = new HelloNative...它崩溃并显示“TypeLoadException”的行时,就像它无法加载本机模块一样。

我想我需要以某种方式包含HelloNativeRT.dll文件,因为我猜它包含本机(编译)代码,因为 winmd 文件可能只嵌入 C++/CX 代码。

我应该如何设置我的项目以包含此 DLL?

我试图把它放在 WP8 项目的根目录,引用它,嵌入它......但没有运气。

4

2 回答 2

4

就我而言,原因很简单:WinRT 组件生成的 .winmd 文件和 .dll 文件必须具有相同的名称(例如:testRT.dll 和 testRT.winmd)。

然后:

  • 添加 .winmd 数据文件作为项目中的参考。
  • 检查 .winmd / dll 文件是否在同一文件夹中才能正确加载。
于 2013-12-17T14:49:26.470 回答
3

你需要:

  • 添加对托管 DLL 文件(包装器)的引用,
  • 添加对您的 winmd 元数据文件(WinPRT 组件)的引用,
  • 将您的本地 DLL 库文件添加为项目的成员,并选择“内容”和“始终复制”的构建操作。
  • 在清单文件中添加一个部分:

WPAppManifest:

<ActivatableClasses>
    <InProcessServer>
        <Path>external_component.dll</Path>
        <ActivatableClass ActivatableClassId="external_component.MyComponent" ThreadingModel="both" />
    </InProcessServer>
</ActivatableClasses>

最后一点是当您从 WP8 项目中引用 WinPRT 项目时 Visual Studio 自动完成的一点;-) 我想没有多少人手动引用本机库,因为关于这一点的文档非常稀少. 我看到提到的解决方案的唯一链接是here ...

于 2013-08-19T14:52:15.327 回答