C# 无法使SAFEARRAY与互操作一起工作

C# 无法使SAFEARRAY与互操作一起工作,c#,c++,interop,atl,C#,C++,Interop,Atl,我有一个ATLCOM服务器,接口的方法是 STDMETHODIMP CWrapper::RUN(long iDataSize, SAFEARRAY** iData) 这个函数的MIDL看起来像 [id(1), helpstring("method RUN")] HRESULT RUN([in] long nSize, [in, size_is(nSize)] SAFEARRAY(_MyDataType*)* iData); 我使用tlbimp从该项目导入tlb,因此可以使用本机阵列。然后我从

我有一个ATLCOM服务器,接口的方法是

STDMETHODIMP CWrapper::RUN(long iDataSize, SAFEARRAY** iData)
这个函数的MIDL看起来像

[id(1), helpstring("method RUN")] HRESULT RUN([in] long nSize, [in, size_is(nSize)] SAFEARRAY(_MyDataType*)* iData);
我使用tlbimp从该项目导入tlb,因此可以使用本机阵列。然后我从C中调用它,如下所示

 m_ServerWrapper.RUN(iInputs.Length,ref iInputs)
其中输入已经被分配,并由我的C程序中的另一个COM对象填充。现在,当我调用C++包装器时,我有一个用于我的SAFAREAR的BADPTR,并且从CWrAPER中调用到一个后续的COM对象::运行失败,因为数组没有使它进入最终的DLL。它显示为未分配。有人知道我做错了什么吗?谢谢

编辑:我应该声明数组在C中看起来很好

EDIT2:调试器显示IDispatch*=0x0000000,5,0x0000000{lpvtbl=0xblahblah},。。。。
所以看起来我的一些信息已经到达了那里。

普通的C数组与安全数组不同。我认为你必须自己做:

[StructLayout(LayoutKind.Sequential)]
struct SafeArray
{
    public ushort   dimensions;  
    public ushort   features;    
    public uint     elementSize; 
    public uint     locks;       
    public IntPtr   dataPtr;     
    public uint     elementCount;
    public int      lowerBound;  
}

然后使用Marshal.allocTaskMem创建内存。填写所有数据,然后传递

我能找到的所有文档似乎都表明互操作层应该将数组封送到IDL中定义的safearrayIs\u MyDataType?如果没有,你应该在那里做。另一件事:你为什么需要nSize?SAFEARRAY保持自己的大小。