Подтвердить что ты не робот

.NET dll "горячая" замена, без перезагрузки приложения

Предположим, что в .NET(С#) есть следующая ситуация:

namespace MyDll
{
    public class MyClass
    {
        public string GetValue()
        {
            return "wrong value";
        }
    }
}

этот код скомпилирован в dll, скажем, MyDll.Dll.

Затем у вас есть приложение MyApplication.exe, которое, используя MyDll.dll в качестве ссылки, создает экземпляр класса MyClass и вызывает метод GetValue:

MyClass instance = new MyClass();
instance.GetValue();

Как только вы поймете, что текущая реализация MyClass.GetValue() неверна, есть ли способ исправить метод MyClass.GetValue(), подобный этому

namespace MyDll
{
    public class MyClass
    {
        public string GetValue()
        {
            return "correct value";
        }
    }
}

и HOT заменять полученный файл MyDll.dll без перезагрузки MyApplication.exe

Все решения, предлагаемые в stackoverflow и в google, не работают, потому что даже если MyDll.dll загружается в новый AppDomain, созданный для этой цели, когда я выгружаю вызов

AppDomain.Unload(anoterAppDomainJustForMyDll);

он возвращается без ошибок, но если я попытаюсь перезаписать исходный MyDll.dll с исправленным (пока MyApplication.exe все еще работает), я получаю сообщение об ошибке "невозможно перезаписать, потому что DLL используется другим процессом"....

4b9b3361

Ответ 1

Вопрос закрыт сам по себе: обратитесь к статье в codeplex

Для меня было важно иметь возможность горячей замены новой dll без перезагрузки приложения, и, как предлагает статья, это можно сделать, поскольку это делается с помощью самого приложения. Причина, по которой мои предыдущие попытки были неудачными, заключалась в том, что я попытался перезаписать целевую dll извне (в этом случае в проводнике). Но если переписывание выполняется, как в предлагаемом решении, из самого приложения, оно работает так, как ожидалось.

Мне нужно немного больше на стороне приложения, чтобы определить каталоги, в которых можно развертывать версии ddls, но это вполне приемлемо для меня.