У меня есть какое-то приложение пользовательского интерфейса, которое живет в панели задач пользователя, написанной на C #. EXE-файл для этого инструмента зарегистрирован в нашей системе контроля версий в ряде проектов, в которых он используется, поэтому мы можем обновить версию, с которой он работает, установив обновленный EXE-файл.
Проблема в том, что когда пользователи получают последнюю версию exe, программа часто запускается, и на их компьютере происходит сбой синхронизации. Я хочу исправить это, чтобы программа не блокировала exe и любые зависимые DLL при запуске, чтобы они могли синхронизироваться без необходимости выключения программы.
В настоящее время у меня есть программа, которая принимает исполняемый файл в качестве параметра и запускает его из памяти, заранее считывая содержимое сборки в память. К сожалению, это полностью завершается ошибкой, когда дело доходит до DLL, которые требуются программе.
Код, который я сейчас имею, выглядит примерно так:
public class ExecuteFromMemory
{
public static void Main(string[] args)
{
//Figure out the name of the EXE to launch and the arguments to forward to it
string fileName = args[0];
string[] realArgs = new string[args.Length - 1];
Array.Copy(args, 1, realArgs, 0, args.Length - 1);
//Read the assembly from the disk
byte[] binary = File.ReadAllBytes(fileName);
//Execute the loaded assembly using reflection
Assembly memoryAssembly = null;
try
{
memoryAssembly = Assembly.Load(binary);
}
catch (Exception ex)
{
//Print error message and exit
}
MethodInfo method = memoryAssembly.EntryPoint;
if (method != null && method.IsStatic)
{
try
{
method.Invoke(null, new object[] { realArgs });
}
catch(Exception ex)
{
//Print error message and exit
}
}
else
{
//Print error message and exit
}
}
}
У меня вопрос, я делаю что-то совершенно глупое? Есть ли лучший способ справиться с этим? Если нет, что я должен сделать для поддержки обработки внешних зависимостей?
Например, приведенный выше код не может загрузить любые зависимые файлы, если вы попытаетесь запустить «Foo.exe», который использует функции из «Bar.dll», «Foo.exe» будет перезаписан, но «Bar.dll» 'все еще заблокирован и не может быть перезаписан.
Я попытался получить список сборок, на которые есть ссылки, из метода GetReferencedAssemblies () загруженного ассемблера, но, похоже, это не дает никаких указаний, откуда следует загружать сборки ... Нужно ли искать их сам? Если да, то как лучше это сделать?
Похоже, другие люди уже сталкивались с этим раньше, и я не хочу заново изобретать колесо.
-
Обновить:
EXE-файл зарегистрирован, потому что именно так мы распространяем наши собственные инструменты командам, которые их используют. Это не оптимально для этого варианта использования, но у меня нет возможности изменить эту политику.