Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编写C++/本机C++;班_C++_Windows 8_Windows Runtime_C++ Cx - Fatal编程技术网

C++ 编写C++/本机C++;班

C++ 编写C++/本机C++;班,c++,windows-8,windows-runtime,c++-cx,C++,Windows 8,Windows Runtime,C++ Cx,由于C++/CX类不允许在公共签名中使用本机类型,因此我需要找到另一种获取信息的方法。我发现了一些关于在internet上编写包装器类的参考,但没有实际的实现。如何在代码中启用以下场景 public ref class MyRefClass { public: void SetNativeType(NativeType *pType); }; 显然这不起作用,那么如何包装NativeType,以便将其传递到MyRefClass 我应该补充一点,这是在一个单独的库中,因此在这里使用int

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

public ref class MyRefClass
{
public:
    void SetNativeType(NativeType *pType);
};
显然这不起作用,那么如何包装
NativeType
,以便将其传递到
MyRefClass


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

假设只需要包装一个指向NativeType的指针就足够了,您可以将其用作“generic”参数

从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类),然后提供一个只负责MyPlainClass并充当公共接口的头文件REF类MyReFreCype。这个解决方案也不是完美的,我猜您在同一个项目中组合使用lib+头文件的两个winrt库时会遇到困难,但可能您不需要支持这种情况。

因为winrt(和COM)解决了二进制API兼容性的真正问题,所以我个人决定使用COM来解决这个问题。您可以在没有IDL或类型库的情况下声明专用接口。您只需要在客户端中包含带有接口声明的头。匹配的IID和接口签名是您所需要的全部(除了计算如何传递IUnknown指针)。

是否需要公开
SetNativeType
?它可能是内部的吗?您需要为每个类型都有一个包装器类。没办法。然后在
SetNativeType
中,您可以从包装器中获取本机类型。我认为您应该询问MyRefClass的使用者是谁。如果您试图创建只由其他C++客户端消费的库,则应考虑将其作为本地DLL或静态库而不是WRT组件。如果它是一个WinRT组件,那么公共表面应该可以从.NET中使用,并且不应该包含本机类型。Cory-包装器是什么样子的@AndyRich-使用者将是多个应用程序(类本身派生自Windows::UI::Xaml::Controls::Page)。我想写一个类,为我们的几个应用程序做所有的UI。如果我可以选择“这个库只会被C++项目使用”,那么我就打开它。如果我创建了一个本地DLL,我仍然可以创建一个ref类类型并从库外部使用它吗?消费者也可以创建并将
NativeType
传递给ref类吗?消费者严格地是本地C++吗?我认为静态库可能是我们的出路。我没有意识到internal可以与静态库一起工作。谢谢。事实证明,在静态库中编写ref类是不受支持的——尽管我可能可以让它工作,因为我不关心它们的警告(我不需要从最终的二进制文件中公开类型)。