我一直在尝试使用以下代码跨 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);
}
在我添加属性之前,buffer
变量的内容在从方法返回跨越 AppDomain
边界后丢失。
类 (SslStream
) 继承自 MarshalByRefObject
但未标记有 Serializable
属性。这是使参数按值传递的唯一方法吗?当类被序列化时,.NET 是否以某种方式识别这些属性?它们是否真的导致参数通过引用传递,或者只是复制了内容?
最佳答案
这是 .NET Remoting 的一个记录非常少的功能。它与您的类是 [Serializable] 还是派生自 MarshalByRefObject 没有任何关系。这里的问题是如何跨 AppDomain 边界编码参数。调用本身是由 Remoting 在幕后进行的。数组不会在调用后自动返回,这显然是一种性能优化。只有 [Out] 属性是必需的,[In] 是隐含的。我在 MSDN 中找不到任何相关文档,只有 a blog post来自遇到相同问题的人(向下滚动到“在远程处理中使用 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;
}
}
关于c# - In 和 Out 属性在 .NET 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9072075/