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