我有一些UI應用程序存在於用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
}
}
}
我的問題是,我在做什麼那麼傻?有沒有更好的方法來處理這個問題?如果不是,我應該怎麼做來支持處理外部依賴?
例如,如果您嘗試運行使用'Bar.dll'中的函數的'Foo.exe',則上面的代碼無法加載任何相關文件,'Foo.exe'將是可覆蓋的,但是'Bar'。 DLL'仍然被鎖定,不能被覆蓋。
我試圖從GetReferencedAssemblies()方法上加載assmebly,但似乎沒有給出任何跡象應該從哪裏加載程序集的引用程序集列表...我需要搜索對他們自己?如果是這樣,那麼做到這一點的最好方法是什麼?
看起來其他人可能以前碰到過這個,我不想重新發明輪子。
- 更新: EXE已簽入,因爲這是我們如何將內部工具分發給使用它們的團隊的工具。它不適合這種用例,但我沒有機會改變這種策略。
你爲什麼要從內存中執行?這是讓你的程序看起來活病毒的好方法。 – Migol 2009-02-27 16:45:51