如何将一个二维数组从C#传递给C++?

4
下面的方法是C++(ATL COM dll)中的方法。
Void Write( Const VARIANT *pData)

pData是一个数据类型为Variant的二维数组。

当我在C# .NET项目中添加此引用时,IDE会将该方法显示为

Void Write( ref object pData);

我该如何从C#传递一个二维数组?


如果您的ALT/COM对象的方法Write声明为Void Write(Const VARIANT *pData),则在您引用dll的c#中将无法看到它。签名是Void Write(Const VARIANT *pData)正确的吗?还是STDMETHOD(Write)(VARIANT* pdata);?在我即将编辑的答案中,我将假设它是STDMETHOD(Write)(VARIANT* pdata); - Olorin
2个回答

0

Variant类型的数组非常适合自身。您可以像这样使用它:

void Write(VARIANT vData)

其中vData.vt == (VT_ARRAY | VT_VARIANT)vData.parrray是数组数据(安全数组 - 可以是任何维度,数组描述符本身包含边界和维数)C#可以正确获取它。


0

关于如何在非托管代码(c ++)和托管代码(例如c#或.NET)之间交换 VARIANT 的方法,这里有一个非常好的教程,它可能对您有所帮助。

编辑

就像我很久以前承诺的那样(抱歉我忘了),我编辑了我的答案:

您可以像这样在c#中声明您的2D数组:

object thearray = new object[,] {{2.0, 1.0},{-3.0, 9.0}} ;

并将其传递给您的com方法。您也可以这样做:

object[,] thetempmatrix = {{2.0, 1.0},{-3.0, 9.0}} ;
object thearray = thetempmatrix ;

请注意,您可能更喜欢定义。
object[,] thearray = {{2.0, 1.0},{-3.0, 9.0}} ;

这也可以工作,但是数组不会被引用传递:假设您的COM方法签名中没有const,它将被您的COM方法更新,但在调用COM方法后退出时,您将得到与传递的那个相同的thearray。当然,这最后一句话与您无关,因为您的COM方法签名中确实有一个const。


请注意,不鼓励使用仅包含链接的答案,Stack Overflow(SO)的答案应该是解决方案搜索的终点(而不是另一个参考站点,这些参考资料往往会随着时间的推移变得过时)。请考虑在此处添加一个独立的摘要,并将链接作为参考。 - kleopatra
谢谢您的评论,我显然缺乏动态关注。;-) 因此,我现在将编辑我的答案。 - Olorin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接