将程序集加载到子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文件将被释放。

真的有可能实现这样的事情吗?

将程序集加载到子AppDomain并释放dll文件

创建App Domain时使用影子复制。它将dll复制到缓存中,任何人都可以与文件系统交互。

Topshelf在我们的货架上做到了这一点(所有东西都在它自己的应用程序域中)- https://github.com/Topshelf/Topshelf/blob/v2.3/src/Topshelf/Model/ShelfReference.cs#L126.

Update: Topshelf不再这样做了,但是更新了一个链接到一个有这样做的版本。