Загрузите сборку в дочерний AppDomain и выпустите DLL-файл - PullRequest
5 голосов
/ 08 августа 2011

У меня есть дочерний домен приложений, в который я хочу загружать некоторые библиотеки dll при запуске и выпускать файлы, чтобы любой мог их удалить.

При запуске я делаю

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.

Действительно ли возможно достичь чего-то подобного?

1 Ответ

5 голосов
/ 08 августа 2011

Использование теневого копирования при создании домена приложения. Это копирует dll в кеш, и любой может взаимодействовать с файловой системой.

Topshelf делает это с нашими полками (тогда все живет в своем собственном домене приложений) - https://github.com/Topshelf/Topshelf/blob/v2.3/src/Topshelf/Model/ShelfReference.cs#L126.

Обновление: Topshelf больше не делает этого, но обновил ссылку на версию, которая сделала.

...