从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 ++代码无法更改。
任何建议都将不胜感激。
答案 0 :(得分:0)
有(至少)两种方法来调用带有VARIANT指针的函数。
理智的方法是将参数声明为ref object data
,.NET将为您编组。 This blog post有更多细节和示例。
另一种方法是自己在内存中创建和填充VARIANT结构,并将地址作为IntPtr参数传递。这可能是矫枉过正的,而VARIANT又大又复杂,因此它的StructLayout并不会很有趣。