C# 将COM可见结构作为参数传递

C# 将COM可见结构作为参数传递,c#,c++,.net,struct,com,C#,C++,.net,Struct,Com,我有一个C#COM DLL,它声明了一个具有ComVisible=true属性的结构。COM客户端是本地C++代码。我可以在COM客户机中实例化结构并将其作为参数传递给COM API之一吗 [ComVisible(true)] [Guid("xxx-xx-xx-xx-xxx")] public struct TestInfo { [MarshalAs(UnmanagedType.BStr)] public string string1; [MarshalAs(Unman

我有一个C#COM DLL,它声明了一个具有ComVisible=true属性的结构。COM客户端是本地C++代码。我可以在COM客户机中实例化结构并将其作为参数传递给COM API之一吗

[ComVisible(true)]
[Guid("xxx-xx-xx-xx-xxx")]
public struct TestInfo
{
    [MarshalAs(UnmanagedType.BStr)]
    public string string1;

    [MarshalAs(UnmanagedType.BStr)]
    public string string2;

}

public interface ISomeInterface
{
    void CallCOMAPI(TestInfo test);
}

public class CoSomeInterface : ISomeInterface
{
    void CallCOMAPI(TestInfo test)
    {
      // test.string1 --- access it
    }
}
现在,因为它被声明为Comvisible,所以我在tlb头中有了必要的定义。所以我能在我的C++客户端中写这样的东西吗?
TestInfo *ptest = new TestInfo();
ptest->string1 = L"something";
ptest->string2 = L"something";
HRESULT hr = provider->CallCOMAPI(*ptest);
当我尝试这样做时,它总是抛出一个无效参数异常。我做错什么了吗


谢谢。

L“某物”不是BSTR,您必须使用SysAllocString()。结构是一个互操作问题,您应该在C++代码中使用IrrordNofIt。当您简单地将其设置为具有两个属性的接口时,问题就会消失。现在,它与您在C#代码中声明的其他接口和类一样简单、明显且无故障。谢谢Hans。对不起,我的事。这肯定不是我在做的,在这里写的时候弄错了。我将查看IRecordInfo。让它成为一个接口当然是一个选择。但我想,如果可能的话,让我使用structs。COM组件是通过CoCreateInstance()创建的。还要确保COM服务器已注册。@Andro47-如果要使用CoCreateInstance(),我必须为此结构创建一个接口。这就像创建另一个接口和一个coclass一样好。这是汉斯以前建议的。