C#函数不会更新SAFEARRAY

时间:2012-12-20 09:36:19

标签: c# c++ com safearray

我有一个带有以下签名的C#函数:

int Get1251Bytes(string source, byte[] result, Int32 lengthOfResult)

我用C ++调用它。编译通知我,第2个参数必须具有SAFEARRAY*类型。所以我这样称呼它:

SAFEARRAY* safeArray = SafeArrayCreateVector(VT_UI1, 0, arrayLength);
char str[] = {'s', 't', 'a', 'c', 'k', '\0'};
converter->Get1251Bytes(str, safeArray, arrayLength);

但是safeArray没有更新,它仍然包含zores。但我在C#unit-test中测试了Get1251Bytes函数。它正常工作并更新result数组。我做错了什么?

2 个答案:

答案 0 :(得分:3)

您的问题与Blittable and Non-Blittable Types有关(Byte是blittable):

  

作为优化,仅包含blittable成员的blittable类型和类的数组被固定而不是在编组期间被复制。当呼叫者和被呼叫者在同一个公寓中时,这些类型可以看起来被编组为输入/输出参数。但是,这些类型实际上是作为In参数封送的,如果要将参数封送为In / Out参数,则必须应用InAttribute和OutAttribute属性。

要修复代码,您需要将[Out]属性应用于C#代码中的result参数:

int Get1251Bytes(string source, [Out] byte[] result, Int32 lengthOfResult)

此外,您无需通过lengthOfResult。在.NET中,您可以使用Length属性来获取数组的大小。

答案 1 :(得分:-1)

即使使用数组,您也必须使用refout。你应该使用out

int Get1251Bytes(string source, out byte[] result, Int32 lengthOfResult)
{
    ...
}

有关outref lokk链接的更多信息。

这里有关于arrays

的文章