У меня есть приложение для пользовательского интерфейса, которое находится в панели задач пользователя, написанной на C#. EXE для инструмента проверяется в нашей системе управления версиями на ряде проектов, которые используют его, поэтому мы можем обновить версию, с которой они работают, путем проверки обновленного EXE.Как запустить программу из памяти на C#?
Проблема заключается в том, что, когда пользователи получают последнюю версию 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() на загруженном assmebly, но это, похоже, не дает никаких указаний, где сборки должны быть загружены из ... Нужно ли искать для них самого? Если да, то каков наилучший способ сделать это?
Похоже, что раньше люди сталкивались с этим, и я не хочу изобретать колесо.
- Обновление: EXE проверяется, потому что это то, как мы распространяем наши собственные инструменты для команд, которые их используют. Это не оптимально для этого варианта использования, но у меня нет возможности изменить эту политику.
И почему вы хотите выполнить из памяти? Это хороший способ заставить вашу программу выглядеть живым вирусом. – Migol