In和Out属性如何在.NET中运行?

我一直在尝试使用以下代码跨AppDomain边界序列化数组:

 public int Read(byte[] buffer, int offset, int count) { return base.Read(buffer, offset, count); } 

作为猜测,在注意到其他地方的属性后,我用[In][Out]属性标记了方法的参数,这似乎导致参数的行为就好像它们是通过引用传递的一样。

例如:

 public int Read([In, Out] byte[] buffer, int offset, int count) { return base.Read(buffer, offset, count); } 

在添加属性之前,从方法跨AppDomain边界返回后, buffer变量的内容丢失了。

类( SslStream )inheritance自MarshalByRefObject但未标记为Serializable属性。 这是使参数按值传递的唯一方法吗? 在序列化类时,这些属性是否被.NET以某种方式识别? 它们真的会导致参数通过引用传递,还是只是复制了内容?

这是.NET Remoting的一个非常难以记录的function。 它与您的类是[Serializable]还是从MarshalByRefObject派生无关。 这里的问题是如何在AppDomain边界编组参数 。 呼叫本身是由Remoting引入的。 在调用之后,数组不会自动被编组,显然是性能优化。 只需要[Out]属性,暗示[In]。 我在MSDN中找不到关于此的任何相关文档,只是来自遇到同一问题的某人的博客文章 (向下滚动到“在Remoting中使用OutAttribute”)。

一些代码可以使用:

 using System; using System.Runtime.InteropServices; class Program { static void Main(string[] args) { var ad = AppDomain.CreateDomain("second"); var t = (Test)ad.CreateInstanceAndUnwrap(typeof(Test).Assembly.FullName, typeof(Test).FullName); var b = new byte[] { 1 }; t.Read(b); System.Diagnostics.Debug.Assert(b[0] == 2); } } class Test : MarshalByRefObject { public void Read([Out]byte[] arg) { arg[0] *= 2; } }