c# – .NET互 *** 作是否来回复制数组数据,还是固定数组?

c# – .NET互 *** 作是否来回复制数组数据,还是固定数组?,第1张

概述我有这个COM方法签名,在C#中声明: void Next(ref int pcch, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] char[] pchText); 我这样称呼: int cch = 100;var buff = new char[cch];com.Next(ref cch 我有这个COM方法签名,在C#中声明:
voID Next(ref int pcch,[MarshalAs(UnmanagedType.LPArray,SizeParamIndex = 0)]          char[] pchText);

我这样称呼:

int cch = 100;var buff = new char[cch];com.Next(ref cch,buff);

.NET互 *** 作层首先将整个数组复制到临时非托管内存缓冲区,然后将其复制?或者数组是否被自动固定并通过引用传递?

为了尝试,我在COM对象(C)中这样做:

*pcch = 1;pchText[0] = L'A';pchText[1] = L'\x38F'; // 'Ώ'

当我在返回时检查C#中的buff [1]时,我会得到’Ώ’.但是我不认为这是一个很强的证据,数组被固定,而不是来回复制.

解决方法 我们来做一个小的实验.首先,让我们改变你的COM方法看起来像这样(C):
STDMETHODIMP CComObject::Next(ulONG* pcch,int* addr,olECHAR* pbuff){    pbuff[0] = L'A';    pbuff[1] = L'\x38F';    *addr = (int)pbuff;    *pcch = 1;    return S_OK;}

然后,更改C#方法签名:

voID Next(ref uint pcch,out IntPtr addr,[In,Out,MarshalAs(UnmanagedType.LPArray,SizeParamIndex = 0)]    char[] pbuff);

最后,测试如下:

uint cch = 10;var buff = new char[cch];IntPtr addr1;unsafe{    fixed (char* p = &buff[0])    {        addr1 = (IntPtr)p;    }}IntPtr addr2;com.Next(ref cch,out addr2,buff);Console.Writeline(addr1 == addr2);

如预期的那样,addr1 == addr2是true.因此,显然,当传递给COM时,数组确实被固定而不是复制.

也就是说,我找不到任何文档,这将是CLR实现的一个硬要素.例如,Mono可能也可能不是这样.

总结

以上是内存溢出为你收集整理的c# – .NET互 *** 作是否来回复制数组数据,还是固定数组?全部内容,希望文章能够帮你解决c# – .NET互 *** 作是否来回复制数组数据,还是固定数组?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1259911.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存