MEF c#服务- DLL更新

本文关键字:DLL 更新 服务 MEF | 更新日期: 2023-09-27 18:08:07

目前,我有一个c#服务,它运行在许多.dll中,并且在启动时导入模块/插件。我想创建一个更新系统,基本上停止服务,删除任何文件,它被告知删除(旧版本),从服务器下载新版本,并启动服务。我相信除了删除部分之外,我已经编码正确了,因为只要我没有覆盖任何内容,文件就会下载。如果我试图覆盖某些内容,它将不起作用,这就是为什么我试图事先删除它。但是,当我执行File.Delete()到我想要执行的路径时,它会给我access to the path is denied。下面是我的代码:

new Thread(new ThreadStart(() =>
            {
                ServiceController controller = new ServiceController("client");
                controller.Stop();
                controller.WaitForStatus(ServiceControllerStatus.Stopped);
                try
                {
                    if (um.FilesUpdated != null)
                    {
                        foreach (FilesUpdated file in um.FilesUpdated)
                        {
                            if (file.OldFile != null)
                            {
                                File.Delete(Path.Combine(Utility.AssemblyDirectory, file.OldFile));
                            }
                            if (file.NewFile != null)
                            {
                                wc.DownloadFile(cs.UpdateUrl + "/updates/client/" + file.NewFile, Path.Combine(Utility.AssemblyDirectory, file.NewFile));
                            }
                        }
                    }

                    if (um.ModulesUpdated != null)
                    {
                        foreach (ModulesUpdated module in um.ModulesUpdated)
                        {
                            if (module.OldModule != null)
                            {
                                File.Delete(Path.Combine(cs.ModulePath, module.OldModule));
                            }
                            if (module.NewModule != null)
                            {
                                wc.DownloadFile(cs.UpdateUrl + "/updates/client/modules/" + module.NewModule, Path.Combine(cs.ModulePath, module.NewModule));
                            }
                        }
                    }

                }
                catch (Exception ex)
                {
                    Logger.log(ex);
                }

                controller.Start();
            })).Start();

我相信这是因为文件正在使用,但我似乎无法卸载它们。我以为停止服务会有效果,但显然没有。我还检查了文件,它们不是只读的(但文件夹是,它位于程序文件中,但我似乎无法让它不是以编程或手动方式只读)。该服务也以管理员(NT AUTHORITY'SYSTEM)的身份运行。我读过卸载AppDomain,但是AppDomain.Unload(AppDomain.CurrentDomain);也返回了一个异常。

不太确定,即使这是一个问题与MEF或我的程序只是没有正确的权限…我认为这主要是因为文件正在使用

MEF c#服务- DLL更新

您将永远无法从已经运行的进程中更新您的程序,您使用的每个dll都将被锁定。

正如你所说,你可以在什么都不做之前创建一个新的应用程序域,在该域中执行你的实际代码,当需要进行更新时,你可以卸载它,但即使这样,你也无法更新服务的可执行文件。

使用一个单独的应用程序或服务。

如果你使用一个应用程序来更新,那么它一定不能从你的服务中启动,一个服务甚至在创建桌面之前就运行了,所以你的更新程序可能会失败。让你的更新程序在会话开始时运行,并让它查询服务器的更新

否则,如果你想从其他服务更新,那么你的主服务可以启动更新服务,更新程序可以停止主服务。使用服务的好处是它可以在没有桌面的情况下运行,在服务器机器的情况下,每个例子都是很常见的,机器运行了几个月甚至没有一个用户会话,所以使用桌面应用程序进行更新将是无效的。

我认为您可以通过使用和更改Web.config中的GUID键来卸载MEF插件。之后,应用程序域将自动重新启动。

例如:

<appSettings>
  <add key="ForceReloadKey" value="[GUID]"/>
</appSettings>