我在当前项目中遇到了一些问题,如果有人能够为我提供一些见解或建议,我将非常感激。重新加载动态代码/重新加载类型
我的项目是一个服务,即执行用户脚本。脚本是用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
我有以下问题
:在这里,问题来了。即我一遍又一遍地构建并加载相同类型的程序集,并且一切都正常工作
2.如果我在构建之后不使用S1,那么即使在检查时我也可以构建S2我可以看到,所有组件L1,S1,L2,S2都装载了组件。显然,如果我加载程序集,但我不会以某种方式使用它“程序集已加载,但类型未加载”。究竟发生了什么?
3.你会建议如何解决我的问题?看起来最合乎逻辑的是使用临时AppDomain,但我没有任何经验,看起来相当复杂,如果有更简单的解决方案,我宁愿使用它。
谢谢
我认为这里的主要答案是:或者看看AppDomain的使用(当你掌握它的时候真的不是那么糟糕),或者查看任何现有的脚本宿主; IronPython,IronRuby,ecmascript和Lua都有相当不错的托管脚本宿主,IIRC –