2 回答
TA贡献1993条经验 获得超5个赞
我过去通过创建源可执行文件的副本解决了这个问题。在您的情况下,您可以:
将“original.exe”保存在特定位置。
每次需要调用它时,创建 original.exe 的副本并将其命名为“instance_xxxx.exe”,其中 xxxx 是唯一编号。
根据需要执行您的新实例 exe,完成后您可以将其删除
您甚至可以通过创建实例池来重用这些实例
TA贡献1780条经验 获得超4个赞
在 Dave Lucre 的回答的基础上,我通过创建绑定到我的包装类的可执行文件的新实例来解决它。最初,我继承IDisposable并删除了 Disposer 中的临时文件,但由于某种原因导致清理会阻塞应用程序的问题,所以现在我的主程序最后执行清理。
我的构造函数现在看起来像:
public AaTrend(string[] args, ILogger logger = null)
{
_logger = logger;
_logger?.WriteLine("Initialising new aaTrend object...");
if (args == null || args.Length < 1) args = new[] { "" };
_tempFilePath = GenerateTempFileName();
CreateTempCopy(); //Needed to bypass lazy single instance checks
HideTempFile(); //Stops users worrying
ProcessStartInfo info = new ProcessStartInfo(_tempFilePath, args.Aggregate((s, c) => $"{s} {c}"));
_process = new Process { StartInfo = info };
}
使用两种新方法:
private void CreateTempCopy()
{
_logger?.WriteLine("Creating temporary file...");
_logger?.WriteLine(_tempFilePath);
File.Copy(AaTrendLocation, _tempFilePath);
}
private string GenerateTempFileName(int increment = 0)
{
string directory = Path.GetDirectoryName(AaTrendLocation); //Obtain pass components.
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(AaTrendLocation);
string extension = Path.GetExtension(AaTrendLocation);
string tempName = $"{directory}\\{fileNameWithoutExtension}-{increment}{extension}"; //Re-assemble path with increment inserted.
return File.Exists(tempName) ? GenerateTempFileName(++increment) : tempName; //If this name is already used, increment an recurse otherwise return new path.
}
然后在我的主程序中:
private static void DeleteTempFiles()
{
string dir = Path.GetDirectoryName(AaTrend.AaTrendLocation);
foreach (string file in Directory.GetFiles(dir, "aaTrend-*.exe", SearchOption.TopDirectoryOnly))
{
File.Delete(file);
}
}
作为旁注,这种方法仅适用于具有(惰性)确定实例化方法的应用程序,这些方法依赖于Process.GetProcessByName(); Mutex如果使用 a 或者如果在清单中明确设置了可执行文件名称,它将不起作用。
- 2 回答
- 0 关注
- 135 浏览
添加回答
举报