从 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#