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

From C# how do I call an unmanaged OLE interface that requires a *VARIANT parameter?

本文关键字:参数 VARIANT 接口 OLE 何调用 调用      更新时间:2023-10-16

从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++代码无法更改。

任何建议将不胜感激。

(至少)有两种方法可以调用采用 VARIANT 指针的函数。

理智的方法是将参数声明为 ref object data,.NET 将为你封送。这篇博文提供了更多详细信息和示例。

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