C#函数不';t更新安全阵列
我有一个具有以下签名的C#函数:C#函数不';t更新安全阵列,c#,c++,com,safearray,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
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单元测试中测试了
Get1251Bytes
函数。它工作正常并更新结果
数组。我做错了什么?即使使用数组,也必须使用ref
或out
。您应该使用out
int Get1251Bytes(string source, out byte[] result, Int32 lengthOfResult)
{
...
}
有关和lokk的更多信息,请访问链接
这里有一篇关于你的问题的文章(
Byte
可快速删除):
作为一种优化,在封送处理期间,将固定只包含可blittable成员的可blittable类型和类的数组,而不是复制这些数组。当调用者和被调用者在同一单元中时,这些类型可以显示为封送为In/Out参数。但是,这些类型实际上是作为In参数封送的,如果要将参数封送为In/Out参数,则必须应用InAttribute和OutAttribute属性
要修复代码,需要将[Out]
属性应用于C代码中的结果
参数:
此外,您不需要通过
lengthOfResult
。在.NET中,您可以使用Length
属性来获取数组的大小。我对C#一无所知,但是byte[]result
是否需要作为ref
类型传入(如果您也打算更新它,那么lengthOfResult
也是如此)?我想,我不需要。数组是C#中的引用类型,我不更改数组的引用本身(只编辑元素的值)。在这种情况下,它应该通过引用进行更新。值得一试。就像我说的,关于C#的知识太多了。有趣的问题。out
和ref
关键字用于允许更改引用本身(new
关键字)。我的函数不改变数组的引用,它只改变元素值)。谢谢你的参考。但是在字节[]结果
之前,我已经尝试了[Out]
和[In,Out]
属性-数组仍然由0填充。@Zharro:我创建了一个示例,复制了您的问题,并通过应用[Out]
属性修复了问题。我觉得有一件事有点奇怪,那就是你传递绳子的方式。我希望非托管参数类型是BSTR
,而不是您似乎正在使用的char[]
。在我的示例中,我使用SysAllocString
创建一个适当的BSTR
,然后通过它。如果启用混合模式调试,则托管代码中也可以有断点,以验证参数是否正确传递。请使用我!我忘记在接口中的Get1251Bytes签名中指定此属性。非常感谢你!
int Get1251Bytes(string source, [Out] byte[] result, Int32 lengthOfResult)