0

我正在尝试手动修补我的应用程序。该应用程序使用了一项服务,我确保在尝试覆盖应用程序 dll 之前停止并卸载该服务。

问题是我无法覆盖甚至删除一些作为应用程序核心的dll文件,这些dll文件由我首先卸载的服务使用。

我使用以下方法传入新的文件路径,以替换位于应用程序根目录内的旧 DLLC:\Program Files\AppName\

公共静态 bool CopyFile(string newFile, string oldFile) {

    var newfile = new FileInfo(newFile);
    var oldfile = new FileInfo(oldFile);

    var f2 = new FileIOPermission(FileIOPermissionAccess.AllAccess, oldFile);
    f2.AddPathList(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, newFile);

    try
    {
        f2.Demand();
    }
    catch (SecurityException s)
    {
        Console.WriteLine(s.Message);
    }


       for (int x = 0; x < 100; x++)
       {
            try
            {
               File.Delete(oldfile.FullName);
               newfile.CopyTo(oldfile.FullName, true);
               return true;
            }
            catch
            {
                Thread.Sleep(200);
            }
       }
       return false;
}

我只想提供一个新文件并删除旧文件,替换它,覆盖它.... 应用程序

注意:我运行以进行修补的应用程序以管理员身份运行。

任何想法?

4

1 回答 1

0

我能够通过使用“中间人”来解决这个问题,换句话说,另一个应用程序下载另一个可执行文件并将命令行参数传递给它。

最初,我的服务会下载一个可执行文件(调用它Installer.exe)。Installer.exe然后会尝试停止服务并修补内容,但这不起作用。

我现在有服务运行,它下载“ Installer.exe”。

Installer.exe将加载和下载PatchPayload.exe

PatchPayload.exe运行并终止服务,将其卸载,然后从集中式服务器下载所有必需的补丁内容并单独修补服务核心文件,然后安装服务并再次运行它。

于 2014-02-14T16:12:49.323 回答