重新加载动态代码/重新加载类型

时间:2013-02-08 11:02:47

标签: c# .net dynamic reflection .net-assembly

我在当前项目中遇到了一些问题,如果有人可以为我提供一些见解或建议,我真的很感激。

我的项目是一项服务,即执行用户脚本。脚本是用C#编写的,我使用CodeDomProvider在运行时构建程序集。程序集包含单个类。

public Script : ScriptBase
{
    public override void Run(){}
}

如果我检测到更改,则允许用户更改脚本。我重建了创建ScriptBase子项的新实例的内容。我知道带有脚本S1的原始程序集A1仍然在当前的AppDomain中加载,但这是我愿意支付的价格。此方案没有任何问题。

我想为用户定义的库添加一个功能(也可以在运行时编辑)。所以现在的问题是我有一个脚本S1,即使用Library L1。如果用户更改L1,我显然必须重建所有脚本。这就是问题所在:

build L1 with type T1
build S1 --depends--> L1
(use S1)
build L2 with type T1
build S2 --depends--> L2 = crashes type T1 is defined in L1 and L2
(use S1) //It passes through if I didn't use S1 for the first time

我有以下问题

  1. 我的第一个场景是如何运作的。即我一遍又一遍地构建和装载相同类型的组件,一切正常

    2.如果我在构建后不使用S1,即使我检查模块时,我能够构建S2,我可以看到所有组件L1,S1,L2, S2装了。显然,如果我加载程序集,但我不会以某种方式使用它来加载"程序集,但是类型未加载"。真正发生了什么?

    3.你会建议什么解决我的问题?看起来最合乎逻辑的是使用临时AppDomain,但我没有任何经验,它看起来很复杂,如果有一个更简单的解决方案,我宁愿使用它。

  2. 谢谢

1 个答案:

答案 0 :(得分:0)

我认为AppDomain是最好的选择。正如马克所说,一旦你知道自己在做什么,它们真的不是那么糟糕,只是找到了我发现问题的信息。

现在,无耻的插件:我为StackOverflow上的另一个问题创建了这个存储库以帮助反射加载程序集,它应该涵盖设置AppDomain的基础知识,并跨越边界与它进行通信:Plugin Demo

从您的问题看,您可以放心地忽略卷影复制部分,只需使用主机项目的扫描仪/通信部分。