C# 如何访问复杂对象';通过COM互操作的属性?

C# 如何访问复杂对象';通过COM互操作的属性?,c#,c++,com,com-interop,C#,C++,Com,Com Interop,所以我有一个接口(IInterface1)公开为ComVisible(true),ClassInterfaceType(ClassInterfaceType.None) 我在那个界面上有一个对象,ala: public interface IInterface1 { Object1 object {get; set;} } 对象1也是ComVisible(true),位于单独的程序集中ClassInterfaceType(ClassInterfaceType.None),看起来是这样的

所以我有一个接口(IInterface1)公开为ComVisible(true),ClassInterfaceType(ClassInterfaceType.None)

我在那个界面上有一个对象,ala:

public interface IInterface1
{
    Object1 object {get; set;}
}
对象1也是ComVisible(true),位于单独的程序集中ClassInterfaceType(ClassInterfaceType.None),看起来是这样的:

public interface IObject1
{
   string MyProperty {get;set;}
}
在C#still中,我有以下课程:

public class Interface1 : IInterface1
{
    public IObject1 Object1 {get;set;}
}
<>从非托管C++,我如何访问接口FACTUROS1.MyPalm?我只导入TLH原始接口,可以创建Interface1类的实例,并访问Object1。如果我试图访问Object1上的MyProperty,我会得到一个“指向不允许的不完整类类型的指针”

<> C++代码看起来像:

Assembly1::Interface1Ptr interface1ptr;
HRESULT hrRetval = CoInitialize(NULL);
hrRetval = interface1ptr.CreateInstance(__uuidof(Assembly1::Interface1));
Assembly1::Object1 *object1;

hrRetval = interface1ptr.get_Object1(&object1);
这就是我被困的地方:

hrRetval = object1->get_MyProperty(varToStore); // This doesn't work.

欣赏任何指针(har-har)。

您可以导入两个程序集,即:

大会1:

namespace ClassLibrary1
{
    [ComVisible(true)]
    public interface IObject1
    {
        string MyProperty { get; }
    }

    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public class Object1 : IObject1
    {
        public string MyProperty { get => "42"; }
    }
}

// AssemblyInfo.cs
[assembly: Guid("d1e7f7b4-3c3a-41e5-b0bf-5dec54050431")]
大会2:

namespace ClassLibrary2
{
    [ComVisible(true)]
    public interface IInterface1
    {
        IObject1 Object1 {get;}
    }

    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public class Interface1 : IInterface1
    {
        public IObject1 Object1 { get => new Object1(); }
    }
}

// AssemblyInfo.cs
[assembly: Guid("a7a14989-71da-49d4-87be-85c4b87bcaf0")]
C++:

顺便问一句,您只想要
raw\u接口
有什么具体原因吗?没有它会更容易、更安全:

ClassLibrary2::IInterface1Ptr i1;
i1.CreateInstance(__uuidof(ClassLibrary2::Interface1));

auto o1 = i1->Object1;
auto bstr = o1->MyProperty;
ClassLibrary2::IInterface1Ptr i1;
i1.CreateInstance(__uuidof(ClassLibrary2::Interface1));

auto o1 = i1->Object1;
auto bstr = o1->MyProperty;