5

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

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

我从 C++ 中调用它。编译器告诉我第二个参数必须有SAFEARRAY*类型。所以我这样称呼它:

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

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

4

2 回答 2

3

您的问题与Blittable 和 Non-Blittable 类型有关(Byte是 blittable):

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

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

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

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

于 2012-12-20T12:12:31.127 回答
-1

即使使用 Array,您也必须使用refor out。你应该使用out.

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

有关outref lokk 的更多信息,请访问链接。

这里是关于数组的文章

于 2012-12-20T10:00:02.083 回答