使用带有作用域的变量的MarshalByRefObject / AppDomain回调失败并显示错误

时间:2015-01-14 21:13:49

标签: c# callback marshalling appdomain

我试图传递一个动作<>到另一个AppDomain中的对象并遇到了咆哮。

这里是远程对象的代码:

public class RemoteEdit : MarshalByRefObject
{
     public RemoteEdit()
     {
     }

     public void DoEdit(Action<string> progress)
     {
           progress("Hello, World");
     }
}

调用此远程对象的代码:

AppDomain d = AppDomain.CreateDomain("newDomain");
RemoteEdit edit = (RemoteEdit)d.CreateInstanceAndUnwrap("MyLib", "MyLib.RemoteEdit");
edit.DoEdit((string dummy) => { 
     Console.WriteLine(dummy);           // This works!
});

int i = 0;
edit.DoEdit((string dummy) => {
     Console.WriteLine(i);               // This crashes.
});

抛出的错误是:

A first chance exception of type 'System.Runtime.Serialization.SerializationException' occurred in Edit.exe

Additional information: Type 'Edit.Edit+<>c__DisplayClass3' in assembly 'Edit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

认为 i是第二种情况下回调函数闭包的一部分,并且远程类不知道如何处理它。但我无法推断为什么RemoteEdit首先需要了解i的任何内容。我认为在任何一种情况下,它只会有一个方法包含在闭包中的任何对象。

这到底是怎么回事?更好的是,我该如何解决? (我拥有这两个课程,我可以作为i电话的一部分作弊并通过DoEdit,并在回调中将其传回给我......但这令人反感。)它需要标记为可序列化的东西,但有问题的对象是int而不是类。

0 个答案:

没有答案