Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将安全数组从C#传递到COM_C#_.net_Com_Interop - Fatal编程技术网

将安全数组从C#传递到COM

将安全数组从C#传递到COM,c#,.net,com,interop,C#,.net,Com,Interop,我使用第三方COM在图片中查找人脸。其中一个方法具有来自SDK的以下签名: long FindMultipleFaces( IUnknown* pIDibImage, VARIANTARG* FacePositionArray ); 参数:pidimage[in]-图像 搜索 FacePositionArray[out]-的数组 FacePosition2将面插入其中的对象 信息被放置。这个数组是 在类型为的安全数组(变体)中 不知道。数组的大小 指定面的最大数量 要搜索的 这转化为以

我使用第三方COM在图片中查找人脸。其中一个方法具有来自SDK的以下签名:

long FindMultipleFaces(
  IUnknown* pIDibImage,
  VARIANTARG* FacePositionArray
);
参数:pidimage[in]-图像 搜索

FacePositionArray[out]-的数组 FacePosition2将面插入其中的对象 信息被放置。这个数组是 在类型为的安全数组(变体)中 不知道。数组的大小 指定面的最大数量 要搜索的

这转化为以下C#方法签名(来自元数据):

乐观地说,我用下面的方式来称呼它,但有一个例外,内存已损坏。仅当图像中存在面时才会引发异常

FacePosition2[] facePositions = new FacePosition2[10];
object positions = facePositions;
int faceCount = FaceLocator.FindMultipleFaces(dibImage, ref positions);

将SAFEARRAY传递给非托管代码的正确方法是什么?

这类似于使用
Marshal.allocTaskMem
初始化数组,然后使用
Marshal.Copy
将其复制到非托管内存中,并将指向数组的
IntPtr
传递到COM方法中

通常,请查看
封送处理类:

这类似于使用
Marshal.allocTaskMem
初始化数组,然后使用
Marshal.Copy
将其复制到非托管内存中,并将指向数组的
IntPtr
传递到COM方法中

通常,请查看
封送处理类:

哎呀,似乎我只需要初始化数组,因为FacePosition2不是一个结构,而是一个类,而且它并没有像我想象的那样自动初始化。这件东西不见了:

for (var i = 0; i < facePositions.Length; i++)
{
  facePositions[i] = new FacePosition2();
}
for(变量i=0;i
哎呀,似乎我只需要初始化数组,因为FacePosition2不是一个结构,而是一个类,而且它没有像我想象的那样自动初始化。这件东西不见了:

for (var i = 0; i < facePositions.Length; i++)
{
  facePositions[i] = new FacePosition2();
}
for(变量i=0;i
有更复杂的方法,但观点更正确: 更改此签名互操作,使其看起来像是接受数组


有更复杂的方法,但观点更正确: 更改此签名互操作,使其看起来像是接受数组


Oops,我似乎只需要初始化数组,因为FacePosition2不是一个结构,而是一个类,而且它并没有像我想象的那样自动初始化。面位置2[]面位置=新面位置2[10];对于(var i=0;i