WP运行时组件 - 类型加载异常?

时间:2013-08-14 10:13:34

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

什么有用>库设置

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

  • “Hello”,一个简单的图书馆项目 - >生成 Hello.dll
  • “HelloNativeRT”,一个带有C ++文件的WP运行时组件 - >生成 HelloNativeRT.dll HelloNativeRT.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项目的根目录,引用它,嵌入它......没有运气。

2 个答案:

答案 0 :(得分:4)

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

然后:

  • 将.winmd medata文件添加为项目中的参考。
  • 检查.winmd / dll文件是否在正确加载的同一文件夹中。

答案 1 :(得分: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 ...