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

Posted

技术标签:

【中文标题】从 C# 如何调用需要 *VARIANT 参数的非托管 OLE 接口?【英文标题】:From C# how do I call an unmanaged OLE interface that requires a *VARIANT parameter? 【发布时间】:2017-01-05 22:21:03 【问题描述】:

我试图从 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++ 代码不能更改。

任何建议将不胜感激。

【问题讨论】:

见msdn.microsoft.com/en-us/library/aa719104(VS.71).aspx VARIANT 是对象 【参考方案1】:

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

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

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

【讨论】:

以上是关于从 C# 如何调用需要 *VARIANT 参数的非托管 OLE 接口?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 InvokeHelper 将 variant* 传递给 C#?

将安全数组的安全数组从 C++ 中的 VARIANT 编组到 C#

c# - 如何调用分配输出缓冲区以在c#中返回数据的非托管c++函数?

调用使用 C# 返回结构数组的非托管 dll 函数

如何将字节数组从 c# 传递到 MFC ActiveX

从传递回完整对象模型的非托管 C++ 调用 C# 方法