c# - In 和 Out 属性在 .NET 中如何工作?

标签 c# serialization parameters attributes marshalbyrefobject

我一直在尝试使用以下代码跨 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/

相关文章:

javascript - 如何使用 Javascript/jQuery 在 URL 中添加或替换查询参数?

c# - 解析excel文件的好资源?

c# - 无法使用 DropDownList 按价格对数据进行排序

c# - 如何让 XamlReader.Parse 不抛出 "property does not exist"XamlParseException?

parameters - Paypal IPN 和付款人电子邮件

design-patterns - 什么是进行函数参数检查的干净方法(或模式)?

c# - 从程序集动态生成 W​​inForms TreeView

c# - 我如何播放音频并匹配文本框中的所有文本

xml - 有哪些好的替代序列化格式?

java.io.NotSerializableException 和实现 Serializable