C# ArrayList 与 C++ 互操作

Posted

技术标签:

【中文标题】C# ArrayList 与 C++ 互操作【英文标题】:C# ArrayList with C++ Interop 【发布时间】:2021-05-19 14:22:19 【问题描述】:

在 C# 中得到这个

public static ArrayList MyFct() 

  var x = new ArrayList();
  x.Add(5);
  return x

在使用 Interop 的 C++ 端,调用 Invoke_3() 后,我得到一个 variant_t,其中包含我的数组,但我如何“提取”它?

(例如我想获取物品的数量等)

【问题讨论】:

问个问题:你为什么用ArrayList而不是List<int> 因为我不知道如何在 C++ 中用变体公开泛型 【参考方案1】:

这是一个包含IDispatch 引用的VARIANT(variant_t 是来自comdef.h / #import 语句的包装器),因此您可以使用IDispatch 的方法,例如像this(省略错误检查):

variant_t v;
HRESULT hr = unk->GetList(&v); // get my VARIANT that contains an ArrayList reference

// get "Count" method dispid
LPOLESTR countName = (LPOLESTR)L"Count";
DISPID dispidCount;
hr = V_DISPATCH(&v)->GetIDsOfNames(IID_NULL, &countName, DISPATCH_METHOD, 0, &dispidCount);

DISPPARAMS dp =  nullptr, nullptr, 0, 0 ;
variant_t count;
hr = V_DISPATCH(&v)->Invoke(dispidCount, IID_NULL, 0, DISPATCH_METHOD, &dp, &count, nullptr, nullptr);

// get "Item(i)" method dispid
LPOLESTR itemName = (LPOLESTR)L"Item";
DISPID dispidName;
hr = V_DISPATCH(&v)->GetIDsOfNames(IID_NULL, &itemName, DISPATCH_METHOD, 0, &dispidName);

for (int i = 0; i < V_I4(&count); i++)

    // build index as variant
    variant_t index(i);
    DISPPARAMS dpIndex =  &index, nullptr, 1, 0 ;

    // get item(i)
    variant_t item;
    hr = V_DISPATCH(&v)->Invoke(dispidName, IID_NULL, 0, DISPATCH_METHOD, &dpIndex, &item, nullptr, nullptr);

    // item can be a scalar value
    // String => VT_BSTR, Int32 => VT_I4, etc.
    // or another ComVisible object => VT_DISPATCH, VT_UNKNOWN, etc.

【讨论】:

谢谢西蒙,请多多关照 -encore- sauvé la vie !

以上是关于C# ArrayList 与 C++ 互操作的主要内容,如果未能解决你的问题,请参考以下文章

通过互操作将字符串数组从 C# 传递到 C++

C# 和 C++ 互操作

字符串数组 C# 与 C++ dll 的互操作性;从 C# 到 C++ dll 的字符串数组,它设置数据并将其发送回 c#

如何在 C# 和 C++ 之间进行互操作

c++ 结构指针转换为数组互操作 c#

使用 COM 互操作从非托管 C++ 访问 c# 属性