2

由于 C++/CX 类不允许在公共签名中使用本机类型,我需要找到另一种获取信息的方法。我在互联网上找到了一些关于编写包装类的参考,但没有实际的实现。如何在我的代码中启用以下场景?

public ref class MyRefClass
{
public:
    void SetNativeType(NativeType *pType);
};

显然这是行不通的,那么我该如何包装NativeType以便可以将其传递给MyRefClass?

我应该补充一点,这是在一个单独的库中,所以使用internal关键字在这里没有帮助。

4

2 回答 2

1

假设只需包装指向 NativeType 的指针就足够了,您可以使用Platform::IntPtr作为“通用”参数。

来自 MSDN:

static IntPtr::operator IntPtr( void* value1);
static IntPtr::operator IntPtr( int value2);
static IntPtr::operator void*( IntPtr value3 );

作为替代方案,您可以将其SetNativeType(NativeType *pType);作为内部的,然后分发带有头文件的静态库,而不是 Windows 应用商店类库。

关于您在评论中提到的警告,您可以尝试使用纯 C++ 类 MyPlainClass,并将其实现导出到 lib 文件中(即使您在其中使用其他 ref 类),然后提供一个仅包含标头的 ref 类 MyRefClass MyPlainClass 并充当公共接口。这个解决方案也不是完美的,我猜你会在同一个项目中组合两个使用你的 lib+header 文件的 winrt 库时遇到麻烦,但也许你不需要支持这种情况。

于 2013-01-23T20:24:00.010 回答
0

由于 WinRT(和 COM)解决了二进制 API 兼容性的真正问题,因此我个人决定使用 COM 来解决这个问题。您可以声明一个没有 IDL 或类型库的私有接口。您所需要的只是在客户端中包含带有接口声明的标头。您只需要匹配的 IID 和接口签名(除了还要弄清楚如何传递 IUnknown 指针)。

于 2014-06-23T09:25:43.647 回答