将程序集加载到子AppDomain并释放dll文件
本文关键字:释放 dll 文件 AppDomain 程序集 加载 | 更新日期: 2023-09-27 18:05:06
我有孩子的应用程序域,我想在启动和发布文件上加载一些dll库,以便任何人都能够删除它们。
On start I do
Loader al = (Loader)domain.CreateInstanceAndUnwrap(
typeof(Loader).Assembly.FullName,
typeof(Loader).FullName);
al.Load(path)
为下面的类。
class Loader : MarshalByRefObject
{
internal void Load(string path)
{
Assembly assembly;
try
{
assembly = Assembly.Load(File.ReadAllBytes(path));
}
catch (Exception) { return; }
}
internal UseType(string fullyQualifiedTypeName)
{
Type userType = Type.GetType(fullyQualifiedTypeName);
}
}
后来我调用UseType
,我得到了正确的类型,但我不能再删除文件,因为它就好像子应用程序域已经锁定了dll。
基本上我想要实现的是在启动时缓存程序集文件,然后使用GetType
调用,以便实际的dll文件将被释放。
真的有可能实现这样的事情吗?
创建App Domain时使用影子复制。它将dll复制到缓存中,任何人都可以与文件系统交互。
Topshelf在我们的货架上做到了这一点(所有东西都在它自己的应用程序域中)- https://github.com/Topshelf/Topshelf/blob/v2.3/src/Topshelf/Model/ShelfReference.cs#L126.
Update: Topshelf不再这样做了,但是更新了一个链接到一个有这样做的版本。