从C#如何调用需要* VARIANT参数的非托管OLE接口?

时间:2017-01-05 22:21:03

标签: c# c++ ole variant

从C#我试图调用用C ++编写的OLE接口。 C ++代码的.ODL文件中的签名是:

long GetData1( int* data );
long GetData2( double* data );
long GetData3( VARIANT* data );

以下是我的C#代码示例:

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyInterface
{
    [DispId(1)]
    long GetData1 ( [In, Out] ref int data );
    [DispId(1)]
    long GetData2 ( [In, Out] ref double data );
    [DispId(3)]
    long GetData3 ( [In, Out, MarshalAs(UnmanagedType.IUnknown)] ref IntPtr data);
}

GetData1()和GetData2()工作正常,但GetData3()导致“类型不匹配”异常。

对于GetData3(),我尝试过In,Out,Ref,MarshallAs(),C#等各种组合。我认为没有成功。

请注意C ++代码无法更改。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

有(至少)两种方法来调用带有VARIANT指针的函数。

理智的方法是将参数声明为ref object data,.NET将为您编组。 This blog post有更多细节和示例。

另一种方法是自己在内存中创建和填充VARIANT结构,并将地址作为IntPtr参数传递。这可能是矫枉过正的,而VARIANT又大又复杂,因此它的StructLayout并不会很有趣。