Я создал приложение под названием MemoryLauncher, которое извлекает двоичный файл исполняемого файла другого приложения в память и запускает его.Цель MemoryLauncher - позволить мне перезаписать .EXE других программ, когда доступно обновление, не беспокоясь о том, что другой пользователь запустит и заблокирует программу.Это работает очень хорошо для меня, за исключением одного: перетаскивание.Я создал программу диспетчера устройств, которую запустит MemoryLauncher, и для этой программы требуется функция перетаскивания, но она кажется отключенной при вызове .EXE в память.Если я нормально запускаю диспетчер устройств, то функция перетаскивания работает нормально.Я подумал, что, возможно, это связано с повышенными привилегиями, поэтому я безуспешно попытался добавить следующий код в mananager и MemoryLauncher:другое приложение и запускает его:
static class Program
{
private static string[] mainArgs;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
mainArgs = args;
if (mainArgs.Length == 0)
MessageBox.Show("Please run from shortcut or command line.", "MemoryLauncher.EXE");
else
{
try
{
if (mainArgs[0].Substring(mainArgs[0].Length - 1) != "\\")
mainArgs[0] += "\\";
byte[] bin = makeBinary(Path.Combine(Path.Combine(Directory.GetCurrentDirectory(), mainArgs[0]), mainArgs[1]));
AppDomain ad = AppDomain.CurrentDomain;
ad.AssemblyResolve += new ResolveEventHandler(ad_AssemblyResolve);
Assembly assembly = Assembly.Load(bin);
MethodInfo method = assembly.EntryPoint;
if (method != null)
{
Object obj = assembly.CreateInstance(method.Name);
String[] argsToPass = null;
if (mainArgs.Length > 2 && mainArgs[2] == "/a")
{
argsToPass = new string[mainArgs.Length - 1];
for (int i = 3; i < mainArgs.Length; i++)
argsToPass[i - 3] = mainArgs[i];
}
if (argsToPass != null)
method.Invoke(obj, new object[] { argsToPass });
else
method.Invoke(obj, null);
}
}
catch (Exception e) { MessageBox.Show("ERROR: " + e.Message, "MemoryLauncher.EXE"); }
}
}
static Assembly ad_AssemblyResolve(object sender, ResolveEventArgs resolveArgs)
{
//Load the assembly from the specified path.
AssemblyName assemblyName = new AssemblyName(resolveArgs.Name);
string folder = mainArgs[0];
byte[] bin = makeBinary(Path.Combine(Path.Combine(Directory.GetCurrentDirectory(), folder), assemblyName.Name + ".dll"));
return Assembly.Load(bin);
}
static byte[] makeBinary(string pathName)
{
FileStream fs = new FileStream(pathName, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
fs.Close();
br.Close();
return bin;
}
}