我有一个带有以下声明的托管函数(包括接口和实现):
[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
String[] ManagedFunction()
{
String[] foo = new String[1];
foo[0] = "bar";
return foo;
}
还有一个本地的C++接口,具有与托管接口相同的方法。在该接口内部,此方法具有以下声明:
void ManagedFunction(SAFEARRAY* foo);
这个函数是由本地代码按以下方式调用的:
void NativeFunction(ManagedBinding binding)
{
CComSafeArray<BSTR> cComSafeArray;
cComSafeArray.Create();
LPSAFEARRAY safeArray = cComSafeArray.Detach();
binding.comObject->ManagedFunction(safeArray);
}
我不确定自己做错了什么,但在我的托管函数被调用后,
safeArray
似乎有着垃圾值。返回值从托管代码转换回本地代码时,出现了问题。请有更多.Net互操作经验的人给我们指点迷津。另外,可能要提到的是,我从我的托管函数返回ValueType
(如果您好奇,是boolean
),但从托管函数返回String
数组时出了问题。谢谢!
binding.comObject
上调用该方法,但我相信肯定有一个很好的理由。ManagedFunction
在获取数组方面没有任何问题。问题在于将其转换回本地代码时出现了问题。 - Tejas SharmaManagedFunction
不应该获取SAFEARRAY
,因为您是通过COM
对象调用托管代码,在COM
中返回值标记为[out, retval]
属性,这会导致编组程序从调用方而不是从被调用方进行编组。 - BigBoss