C#函数不会更新SAFEARRAY

Zha*_*rro 5 c# c++ com safearray

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

int Get1251Bytes(string source, byte[] result, Int32 lengthOfResult)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*age 3

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

作为一种优化,可直接传送类型的数组和仅包含可直接传送成员的类的数组在封送期间将被固定而不是复制。当调用者和被调用者位于同一单元时,这些类型可能会被封送为 In/Out 参数。但是,这些类型实际上被封送为 In 参数,并且如果要将参数封送为 In/Out 参数,则必须应用 InAttribute 和 OutAttribute 特性。

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

int Get1251Bytes(string source, [Out] byte[] result, Int32 lengthOfResult)
Run Code Online (Sandbox Code Playgroud)

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