Windows runtime 如何在另一个C++/CX WinRT组件?

Windows runtime 如何在另一个C++/CX WinRT组件?,windows-runtime,c++-cx,winrt-component,Windows Runtime,C++ Cx,Winrt Component,在另一个C++/CX WinRT组件中,是否有方法使用ref类的本机参数调用内部方法?我知道有一种解决方案是通过以int形式公开的指针,但有没有更好的方法呢?类似于包含来自其他库的头文件而不使用托管引用(通过这种方式,我从C#Component3“error CS0433:类型“Class1”同时存在于使用这两个库的其他组件的“Component1”和“Component2”中获得了错误消息) 组件1/class1.h: public ref class Class1 sealed

在另一个C++/CX WinRT组件中,是否有方法使用ref类的本机参数调用内部方法?我知道有一种解决方案是通过以int形式公开的指针,但有没有更好的方法呢?类似于包含来自其他库的头文件而不使用托管引用(通过这种方式,我从C#Component3“error CS0433:类型“Class1”同时存在于使用这两个库的其他组件的“Component1”和“Component2”中获得了错误消息)

组件1/class1.h:

    public ref class Class1 sealed
    {
    internal:
        bool InternalMethodForComponent2(NativeType& param1);

    public:
        Class1();
        virtual ~Class1();

        int SomeMethodForComponent3();
    private:

    };
组件2/class2.cpp:

//#include "Component1/class1.h" - replaced by adding reference because of CS0433 in Component3

void Class2::SomeMethod(Class1^ obj)
{
    NativeType nt;
    nt.start = 1;

    ...

    obj->InternalMethodForComponent2(nt); //does not work - error C2039: 'InternalMethodForComponent2' : is not a member of 'Component1::Class1'
}
组件3/class3.cs:

void MethodInClass3()
{
    Class1 obj1 = new Class1();
    Class2 obj2 = new Class2();

    obj2.SomeMethod(obj1);
    var res = obj1.SomeMethodForComponent3();
}

正确的方法是在定义
Class2
时包含标题
Class1.h
;通过添加对WinMD(元数据)的引用,编译器只知道
public
成员。添加头可以让编译器看到真正的C++类型,包括内部< /COD>成员。
如果没有完整的代码示例,则很难理解包含标题时出现的错误,尽管我的最佳猜测是您有两个名称空间,并且对
Class1
的引用不明确。首先,您可以将
Class1
Class2
放在同一个
.h
/
.cpp
文件中,以简化操作并完全避免外部头引用。

在编译C++/CX代码时不太可能出现C编译器错误。这个问题没有多大意义。这个C#错误来自组件3,它引用了C++/CX WinRT组件1和2。到底什么是没有意义的?我只看到一个类的代码。当然,这是不可能的,内部方法只能从位于同一程序集中的C#代码中调用。C++代码从来都不是C语言程序集的一部分。它必须是公共的,还可以确保互操作管道得到处理。别无选择。谢谢您的评论,但我不想从C#调用内部方法,但从另一个C++/CX组件,您可能错过了它。还有另一种选择——将此方法公开,并将NativeType的引用转换为封装为int的指针,但它很难看。我只是在寻找更好的选择。重提一个老话题。。。有没有一种方法可以包含一些头并引用winmd文件?因为这样做会得到一个类的重新定义(这很有意义)。为什么需要引用WinMD文件?您能提供一个完整的问题示例吗?因为需要组件的其他未公开部分,而导出标题不是初始计划的一部分。我想这样做的方法是重做组件,以便定义公共接口的所有头文件都可以导出。