这可能看起来像重复,但事实并非如此,它实际上是一个不同的问题!
场景是这样的:我有一个 Web 应用程序,它遍历所有动态加载到系统中的 dll,以从中访问一个方法并获取数据。这些 dll 由网站的用户添加。
伪代码将是这样的:
pulic void GetNews(){
foreach(var i in ListOfDllPaths){
Assembly dll = Assembly.Load( File.ReadAllBytes(i));
SomeInterface if = CreateInstance(dll); //This methods does all the validation and such
if.DoMethod();
}
}
现在的问题是,在每次调用 GetNews() 时,都会重新加载相同的 dll,多次加载相同的 dll。我可以使用 Assembly.LoadFrom 或 LoadFile 来避免这个问题,但是我会锁定我不想要的文件,因为我希望能够删除它。
另一种选择是使用新的应用程序域来加载它们,调用方法并卸载它们,但是我还必须在该域中加载接口 dll,而我真的不知道它在网络应用程序中的路径. 更不用说将数据从一个应用程序域移动到另一个应用程序域是一件痛苦的事情,而且很难完成。
第三种选择是使用卷影副本,但随后我将无法删除相同结果的卷影副本。
选项?基本上我需要的是,加载 dll,使用它,卸载它,继续。