String dlls = ConfigurationManager.AppSettings["ApiFolder"];
FileInfo[] files = new DirectoryInfo(dlls).GetFiles("*.dll");
foreach (FileInfo file in files) {
if (!LoadedApis.ContainsKey(file.Name)) {
Assembly ass = Assembly.LoadFrom(dlls + file.Name);
foreach (Type t in ass.GetTypes()) {
if (t.GetTypeInfo().FindInterfaces((x, y) => true, null).Contains(typeof(IApi))) {
IApi api = (IApi)ass.CreateInstance(t.FullName);
LoadedApis.Add(file.Name, api);
}
}
}
}
我使用上面的代码将具有特定接口的所有DLL从文件夹加载到字典中,以后我可以访问它们。我正在开发一个插件系统,你需要做的就是插入一个DLL,它将被加载和使用。
它工作得很好但是我想要考虑的一个用例我目前还不知道该怎么做。我想允许删除或更新DLL。
是否可以释放已加载反射的DLL,以便可以删除或覆盖它?我想我不得不打几个互操作电话,但我不知道要做哪些。
或者,一种不同的方法,我可以将DLL加载到内存中,所以我从来没有锁定文件开始吗?
答案 0 :(得分:2)
如果不卸载所有组件,则无法卸载单个组件 包含它的应用程序域。使用卸载方法 AppDomain卸载应用程序域。有关更多信息,请参阅 如何:卸载应用程序域。