0

好的,我会尽量保持简短:)

本质上,我所拥有的是一种架构,它创建了一个新的 appdomain 并将插件程序集加载到其中。这样一来,插件 DLL 就可以使用 Shadow Copy 进行热交换,而无需使服务脱机。

然后我得到了一个字典,其中包含对那些加载的插件的引用(真正的代理对象是使用 MarshallByRef 生成的)

当工作进入服务时,它通常需要几个插件来处理传入的工作负载。我想为每个插件启动一个新线程并为其提供工作负载,以便可以并行处理工作(我正在使用 TPL 来实现这一点)

List<Action> actions = new List<Action>();
foreach(var work as workitemgroup){
    actions.Add(delegate() {
        PluginManager.Dispatchers[work.workType.ToLower()].Execute(work.workload); 
    });
}
Parallel.Invoke(actions.ToArray());

问题是这个(命名空间名称已更改以保护无辜者;)

键入'System.Linq.Lookup`2+Grouping[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[App.Model.Work.Workload, App.Model, Version=1.0 .0.0, Culture=neutral, PublicKeyToken=null]]' 在程序集 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 未标记为可序列化。

奇怪的是,如果我将代表更改为:

actions.Add(delegate() { Console.WriteLine("test"); }

...它工作正常,但我的问题是 - 在这种情况下需要序列化什么?AFAIK 委托不需要序列化并发送到另一个 AppDomain - 它应该在此处执行,然后对代理的调用将需要工作负载模型的序列化(无论如何都标记为可序列化)。

4

2 回答 2

1

我只能猜测您在传递给远程插件的操作委托中使用了本地创建的一些对象,并且这些对象不可序列化。使用 Console.Writeline 您不会将任何不可序列化的对象传递给插件,这就是它起作用的原因。

于 2013-05-16T14:04:45.017 回答
1

找到了 -

work.workload 是无法序列化的 LINQ 表达式的结果 - 使用 work.workload.ToArray() 将其转换为数组就足以赢得胜利

于 2013-05-16T15:11:01.230 回答