Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#函数不';t更新安全阵列_C#_C++_Com_Safearray - Fatal编程技术网

C#函数不';t更新安全阵列

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

我有一个具有以下签名的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单元测试中测试了
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)