2009-01-19 79 views
5

问题陈述:实现一个允许覆盖相关程序集的插件系统(避免文件锁定)。在.Net中,特定程序集可能不会被卸载,只有整个AppDomain可能被卸载。如何在不使用AppDomains的情况下实现.net插件?

我发布这个,因为当我试图解决问题时,每个解决方案都提到使用多个AppDomains。即使在项目开始时构建,多个AppDomain也很难正确实施。

另外,AppDomain对我无效,因为我需要跨域传输Type作为Speech Server worfklow的InvokeWorkflow活动的设置。不幸的是,跨域发送类型会导致程序集被注入本地AppDomain。

此外,这与IIS有关。 IIS具有Shadow Copy设置,允许执行的程序集在加载到内存时被覆盖。问题是(至少在XP下,没有在生产2003服务器上测试),当你以编程方式加载程序集时,阴影副本不起作用(因为你正在加载DLL而不是IIS)。

回答

8
  1. 检查程序集是否已经加载(以避免由于一次又一次加载相同程序集而导致内存泄漏)。
  2. 如果未加载,请将程序集读入字节数组。这将防止锁定文件。
  3. 供应字节数组作为arguement到Assembly.Load

以下代码假定你知道一个组件的全名。

Assembly assembly = null; 

foreach(Assembly loadedAssembly in AppDomain.CurrentDomain.GetAssemblies()) 
    if (loadedAssembly.FullName == "foobar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") 
     assembly = loadedAssembly; 

if(assembly == null) 
{ 
    byte[] studybin = System.IO.File.ReadAllBytes(@"C:\pathToAssembly\foobar.dll"); 
    assembly = Assembly.Load(studybin);     
} 

需要注意的是,如果你想在目录中查找特定的组件,你可以运行“System.Reflection.AssemblyName.GetAssemblyName(路径);”查看FullName是否符合您的要求。 'GetAssemblyName(path)'不会将程序集注入到当前的AppDomain中。

另请注意,此解决方案不适用于只能很少重新启动且应用程序更改频率较高的应用程序。每次加载程序集时,应用程序的内存占用量都会增加。没有办法卸载程序集,因此缩小内存使用率的唯一选择是重新启动应用程序。但是,这种限制通常比使用多个应用程序域的大性能,内存和代码复杂性开销更可取。如果您想使用Type s,这个限制也是不可避免的。

+0

我想这意味着你仍然必须重新启动使用新的插件一旦被替换磁盘上的应用程序?我曾经有过这样的印象:即使你重新加载了组件,一旦类型被加载,它也不能被改变。 – 2009-01-20 01:49:04

2

如果你想分离你的加载项,你必须......

  1. 创建扩展 MarshallByRefObject将 与加载项交互型(让我们称之为 它FOOMASTER)
  2. 创建一个新的appdomain(让我们叫它 addinLand)
  3. 请致电 addinLand。CreateInstanceAndUnwrap到 在 addinLand创建FOOMASTER的实例,并获得在 当前应用程序域
  4. 告诉FOOMASTER代理加载您的加载项

现在您的加载项加载在addinLand,你可以与他们互动您的主要AppDomain通过您的FOOMASTER代理。当你的插件崩溃时,他们不会取消你的应用程序。

它是一个有趣的,有点混乱的过程。我原本以为这个想法是加载你的插件,然后将它们作为透明代理放到当前的应用程序域中,但最好的设计是将插件作为简单的对象与更复杂的类型交互(FOOMASTER) MarshallByRefObject,加载到addinLand应用程序域中,以及与其交互的透明代理。

CLR Via C#的第21章和第22章对理解过程非常有帮助。

2

如果您对使用插件架构构建系统的严肃方法感兴趣,您可能需要查看现在属于.NET Framework的MAF(托管加载项框架),即系统。 AddIn命名空间。

它将帮助您管理插件隔离和版本控制,甚至与合同的向后兼容性。

尽管这里有一些学习曲线,所以这可能不是你正在寻找的东西。

http://msdn.microsoft.com/en-us/library/bb384200.aspx

相关问题