2013-02-08 150 views
0

我在当前项目中遇到了一些问题,如果有人能够为我提供一些见解或建议,我将非常感激。重新加载动态代码/重新加载类型

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

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

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

我想添加用户定义库的功能(在运行时也可编辑)。所以现在的问题是我有一个脚本S1,即使用库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,但我没有任何经验,看起来相当复杂,如果有更简单的解决方案,我宁愿使用它。

谢谢

+1

我认为这里的主要答案是:或者看看AppDomain的使用(当你掌握它的时候真的不是那么糟糕),或者查看任何现有的脚本宿主; IronPython,IronRuby,ecmascript和Lua都有相当不错的托管脚本宿主,IIRC –

回答

0

我觉得一个AppDomain是这里最好的选择。正如马克所说,一旦你知道你在做什么,他们真的不是那么糟糕,它只是找到我发现问题的信息。

现在,无耻插头:我做了这个信息库在计算器上的另一个问题,以帮助反射装组件,它应该包括建立与它跨越边界的通信的应用程序域的基础:Plugin Demo

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

+0

好吧,我期望从答案中得知,有人还会解释什么时候从程序集中加载Type。无论如何,你的例子非常有帮助,我非常感谢你。 – Biggles