如何从托管项目中引用本机 WinRT 组件?

Posted

技术标签:

【中文标题】如何从托管项目中引用本机 WinRT 组件?【英文标题】:How to reference a native WinRT component from a managed project? 【发布时间】:2011-11-21 11:10:48 【问题描述】:

据说您可以创建一个可以在 C# 中使用的 C++ WinRT 组件。我有一个简单的测试项目 - 一个 C# XAML 应用程序和一个仅使用基本 WinRT 组件项目模板的 C++ 项目。当我尝试在 C# XAML 项目中添加项目引用时,它说它无法添加引用(不知道为什么)。我可以构建本机 WinRT 组件,并生成一个 .winmd 文件,我可以使用添加引用对话框中的浏览按钮手动添加对这个 .winmd 文件的引用。这允许我访问本机库中的方法,但是当我构建时,它说它正在使用 Platform.IDisposable,但该类型是在未引用的程序集中定义的。我还没有看到任何会议演示了这种情况。

【问题讨论】:

【参考方案1】:

找到答案了!看起来这是一个小故障,但它有一个解决方法: http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/1900bd21-8693-4127-800a-f35cfd5daac2

基本上,首先清理 WinRT 组件项目,然后添加引用,然后手动添加对位于 \VC\bin 中的 platform.winmd 的引用,然后就可以开始了。

【讨论】:

【参考方案2】:

您引用的 C++ WinRT 程序集可能使用实现 IDisposable 接口的对象,因此您还必须引用包含该接口的 C++ 程序集。

【讨论】:

什么 C++ 程序集?据说,WinRT 的所有核心程序集都已被自动引用。参考对话框中没有其他标准组件可供选择。 @Jeremy 看起来您需要将Microsoft.VCLibs 的引用添加到.NET 应用程序才能解析Platform.IDisposable(附带说明,我希望它被投影为@ 987654323@,但它不会发生......)。但是,将其添加为参考似乎会在部署时引起问题。可能是开发预览的怪癖。 是的,我注意到 Microsoft.VCLibs 并尝试了它,它看起来就是它的定义位置,但我在部署时也遇到了错误。将不得不研究包装的东西——也许 VCLibs 必须包含在包中才能工作?任何人都能让它工作吗? 也许您应该发布一个新问题,因为您可能会收到回复,因为原始问题现在发生了变化。【参考方案3】:

所以我遇到了类似的问题,在添加了对 Microsoft.VCLibs 的引用后,我无法部署。但是我注意到,默认情况下 WinRT 组件被编译为 x86 代码,而 C# Metro 风格应用程序针对任何 cpu,这在我的案例中是根本原因。将 C# 应用程序切换到 x86 解决了这个问题。

【讨论】:

以上是关于如何从托管项目中引用本机 WinRT 组件?的主要内容,如果未能解决你的问题,请参考以下文章

Unity如何使用本机dll或转换为托管

如何将非托管库引用添加到 NUnit 测试

托管 c++ 库,它是如何工作的?

如何将 void* 的引用从 C++/CLI 传递给本机 C 函数

如何添加对由 C# 项目调用的非托管 C++ 项目的引用?

转换为C ++ CLI托管对象引用的本机指针?