【问题标题】:C++/CX component "public enum class" Does not link correctly in C# Metro AppC++/CX 组件“公共枚举类”在 C# Metro App 中未正确链接
【发布时间】:2012-08-02 02:08:40
【问题描述】:

我正在尝试将 D3D11 调用封装在我正在开发的 API 中。

我制作了一个 C++/CX 组件库,我正尝试在 C# 中使用它。如果 C++/CX 组件和 C# 项目在同一个解决方案中,这很简单明了,一切都会正常工作...

...但是如果我在其 OWN 解决方案中创建我的 C++/CX API 组件,则创建第二个 C# Metro App 解决方案并将我的 C++/CX 组件“项目”添加到其中,然后让我的 C# Metro App 引用 C++ /CX 组件项目我在尝试使用在 C++ 中声明的公共枚举时遇到运行时错误。

这是我的 C# 应用似乎无法链接到的公共枚举类错误。

"找不到 Windows 运行时类型 'Reign.Video.D3D11.FeatureLevels'。”

这非常令人沮丧,因为我似乎无法让我的 C++/CX“API”内容在 C# 应用程序中正确链接以进行测试。您打算如何在 Metro 上高效地测试用 C++ 制作的 API?您不能将 C++/CX 组件链接到 C# 项目,除非在同一个解决方案中,并且如果您尝试将 C++/CX 项目链接到 C# 解决方案并从那里链接它,则会出现运行时错误...

编辑:这是演示我的问题的下载链接: Download

【问题讨论】:

  • 您是否尝试过将 Reign.Video.D3D11.FeatureLevels 枚举设为“枚举”而不是 C++0x“枚举类”?
  • 如果你这样做,枚举根本不会暴露给 C#... 它必须是一个“枚举类”。
  • 您应该在使用您的项目构建的 Reign.Video.winmd 文件上运行 ildasm 工具。这将显示所有暴露给 C# 的类。可能其中包含有助于诊断问题的信息。
  • 嘿 tnx 获取有关“ildasm”的信息不知道该工具存在,非常有用。尽管它似乎对我没有帮助。它表明“FeatureLevels”实际上是存在并被暴露的。
  • 嗯。底层 __value 条目的类型是什么?

标签: c# enums microsoft-metro windows-runtime c++-cx


【解决方案1】:

Windows 运行时要求必须在与包含的 .winmd 文件的名称匹配的命名空间中找到所有类型。在您链接的演示中,您生成的 winmd 名为 ExternalWindowsRuntimeComponentProject.winmd,但您的非工作类位于 Reign.Video.D3D11 命名空间中。 WinRT 不允许这样做,并且 .NET 类型加载器将无法找到不在关联命名空间中的类型。

这里的解决方案是确保FeatureLevels 枚举位于名为Reign.winmdReign.Video.winmdReign.Video.D3D11.winmd 的winmd 中。

【讨论】:

  • 经过我的发现,我想出了这么多或者有一个错误......我建议 MS 为这种情况添加一个编译时错误。
  • RTM视觉工作室里应该有一个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
相关资源
最近更新 更多