我试图传递一个动作<>到另一个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
而不是类。