我有一些 UI 应用程序,它位于用 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
}
}
}
我的问题是,我在做一些完全愚蠢的事情吗?有没有更好的方法来处理这个?如果不是,我应该怎么做才能支持处理外部依赖项?
例如,如果您尝试运行使用“Bar.dll”中的函数的“Foo.exe”,上述代码无法加载任何依赖文件,“Foo.exe”将是可覆盖的,但“Bar.dll”仍然是被锁定并且不能被覆盖。
我尝试从加载的程序集上的“GetReferencedAssemblies()”方法获取引用程序集的列表,但这似乎没有给出任何指示应该从哪里加载程序集......我需要自己搜索它们吗?如果是这样,最好的方法是什么?
似乎其他人以前可能遇到过这种情况,我不想重新发明轮子。
- 更新:EXE 已签入,因为这就是我们将内部工具分发给使用它们的团队的方式。它不是这个用例的最佳选择,但我没有机会更改该策略。