C# 如何访问复杂对象';通过COM互操作的属性?
所以我有一个接口(IInterface1)公开为ComVisible(true),ClassInterfaceType(ClassInterfaceType.None) 我在那个界面上有一个对象,ala: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),看起来是这样的
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;