我有一个带有以下签名的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
数组。我做错了什么?
答案 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)