原来被误导了
我尝试在一个程序域加载一个dll后,我们还能更新这个dll,文中说了两点,但当时是被系统误导了。我以为已找到问题所在,并把他总结了下来,有了这么一文。后来觉得奇怪,为什么机器重启后,dll却无法更新。于是发现调试时间一长,系统就乱来了,服务运行后(我写的是一个windows服务程序),所有dll都能删除,连主程序也可以。这种机会出现没有规则。
于是再找无法更新的原因,在提前出来换停车位置时,我突然想到了一点,回来测试才明白使用RemoteLoader的用意。
所有在另一个程序域加载的程序集、构造的对象都不能在主程序域中保存。为了主程序域能访问次程序域的对象只有利用RemoteLoader,次程序域的程序集、构造的对象绝不能通过RemoteLoader来暴露给主程序域,但可以通过方法来让主程序域使用这些对象。
主程序域中直接调用,以下代码一运行就会锁住dll,无法更新
object obj = this.loader.ReSetJob(this.txtClass.Text);
DomainBin.BoxDo box = (DomainBin.BoxDo)obj;
MessageBox.Show(box.Hello());
借loader来调用,则不会。loader有一个类型为RemoteLoader成员
this.loader.SayHello(this.txtClass.Text);
其SayHello方法就是调用RemoteLoader
public void SayHello(string configVal)
{
this.remoteLoader.SayHello(configVal);
}
于是再找无法更新的原因,在提前出来换停车位置时,我突然想到了一点,回来测试才明白使用RemoteLoader的用意。
所有在另一个程序域加载的程序集、构造的对象都不能在主程序域中保存。为了主程序域能访问次程序域的对象只有利用RemoteLoader,次程序域的程序集、构造的对象绝不能通过RemoteLoader来暴露给主程序域,但可以通过方法来让主程序域使用这些对象。
主程序域中直接调用,以下代码一运行就会锁住dll,无法更新
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
借loader来调用,则不会。loader有一个类型为RemoteLoader成员
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)