【问题标题】:Use Universal Windows C# class library from Native C++从 Native C++ 使用通用 Windows C# 类库
【发布时间】:2018-12-28 07:50:08
【问题描述】:

我有带有 UI 组件的通用 Windows C# 类库。我想知道我是否可以在 Native C++ 中使用它。

我尝试使用regasm将类库dll转换为tlb文件,但报错

错误:程序集不能是 Windows 运行时程序集。

我还尝试为 C# 类库制作 WinRT/WRL 包装器,并尝试从 Native C++ 加载它。但是当我为包装 dll 调用 LoadLibrary 时,它返回 'nullptr' 并出现 126 错误,即使所有 dll 和可执行文件都在同一个目录中。

那么如何从 Native C++ 使用通用 Windows 类库呢?有可能吗?

【问题讨论】:

  • 将您的类库公开为 COM 组件,然后将其用作本机代码中的 COM 组件。

标签: c# c++ windows-runtime


【解决方案1】:

您必须将您的类库公开为 COM 组件并从本机代码调用它,这是最方便的解决方案。 您将无法从本机 C++ 调用通用 Windows C# 类库,因为它不会被识别,并且正如您在问题中提到的,它将导致 nullptr 异常。

有趣的是,你可以反过来做!

您可以创建一个本地 C++ 库并在通用 Windows C# 平台中调用它 - MSDN 中有关于这种做法的完整帖子:

Use Existing C++ Code in a Universal Windows Platform App

在我看来很有趣的是,你可以做一件事,但不能反过来做,但很高兴知道至少有一种方法实际上是可能的。

【讨论】:

【解决方案2】:

我不确定“方便”是用来描述将本机 C++ 公开为 COM 组件的词。

你应该看看 C++/WinRT

https://docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis.

它似乎取代了 C++/CX,这是微软最初允许使用 C++ 构建和使用 WinRT 组件的方法。

【讨论】:

  • C++/WinRT 不是要使用现有的 winrt API 吗?有没有办法在 C++/WinRT 中使用自定义 winrt/wrl 库?
  • 根据 MS C++/WinRT 旨在替换 C++/CX,可用于构建和使用 WinRT api。这将包括自定义 APIS。仅供参考,我使用 C++/CX 构建和使用自定义 WinRT API,但未使用 C++/WinRT。两种技术的目的是一样的,只是隐藏了 COM 的丑陋。
  • 很好地构建 WinRT api 是一回事,而从本机 Win32 C++ 调用它们是另一回事。不过,您的答案看起来很有希望。如果您能提供真实的例子,将不胜感激
  • 我所有的真实世界代码都是 C++/CX。 Microsoft 示例位于docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/…。我已经提供的链接中提供了完整的文档。 YouTube 上也有很多资料。
猜你喜欢
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 2012-04-28
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
相关资源
最近更新 更多