3

我需要实现一个包装器来向 C# 公开一些本机 C++ 代码,并遵循本教程:

http://www.silverlightshow.net/items/Windows-Phone-8-Native-Code-Support.aspx

到目前为止,在我的 C# 测试项目中,只要我引用整个项目(.sln),我从运行时组件项目中实例化一个用 C++/CX 编写的类并使用该类中的方法都没有问题。

Visual Studio 不允许我单独引用运行时组件 DLL,但允许我引用项目中的 .winmd 文件。C# 然后正确识别命名空间,但是在运行时我TypeLoadException尝试创建相同的对象时得到一个。

这似乎不是命名空间问题(如此处所述:Changing namespace name of C++ component in Windows Phone 会导致异常),因为只要我创建项目引用(或引用项目与 .winmd以某种方式影响命名空间?)。

是否可以以某种形式捆绑运行时组件,最终用户可以引用它而无需提供整个项目?

4

3 回答 3

1

我遇到了同样的问题,并且(最终)发现 .dll 和 .winmd 文件需要具有相同的名称(与它们定义的命名空间相同)并且位于同一目录中。

例如,如果您的类位于 X::Y 命名空间中,则文件必须是 XYdll 和 XYwinmd。

然后我需要做的就是在我的项目中添加对 .winmd 文件的引用(通过在解决方案资源管理器中右键单击该项目的引用文件夹,选择“添加引用...”,然后从出现的对话框)。我不需要向清单文件添加任何内容。

于 2013-09-22T15:10:10.497 回答
1

我认为您所看到的是这里描述的问题的表现。

简而言之,在使用 C++ 创建 WinRT 组件时,仅引用输出 DLL 或输出 winmd 是不够的。你需要两者。

于 2013-08-23T19:26:48.760 回答
1

您需要添加以下 toWMAppManifest.xml

<ActivatableClasses>
    <InProcessServer>
        <Path>YourComponent.dll</Path>
        <ActivatableClass ThreadingModel="both" ActivatableClassId="YourComponentNamespace.YourComponent"/>
    </InProcessServer>
</ActivatableClasses>

作为YourComponent你的 WinMD 的名字。

于 2013-08-23T19:31:21.633 回答