-->

运行时不锁的应用程序的文件(Don't lock files of application

2019-06-25 08:48发布

我创建一个应用软件,能够进行自我更新。 启动后,应用程序会检查是否有更新缴费,下载这些文件(组件),然后进入加载它们。

然而,当应用程序由多个用户在同一时间运行的问题。 这发生在终端服务器上运行时。 应用程序不能取代那些旧的文件,因为Windows将它们锁定。

有没有办法解决这个问题的简单方法? 这是一个传统的应用程序,我没有改变应用程序或更新机械的大型零件的时间。

Answer 1:

一个简单的解决办法是使用卷影复制 。

简单的例子:

class Program
{
    static void Main(string[] args)
    {
        var x = AppDomain.CreateDomain("TestAssembly", null, new AppDomainSetup() { 
                                                            ShadowCopyFiles = "true",
                                                            CachePath = @"c:\tmp", 
                                                            ApplicationName = "ShadowCopyTest"
                                                       });
        var a = x.Load("TestAssembly"); // Load Assembly and run...
    }
}

你可以创建一个能够加载应用程序中使用的卷影拷贝( 可执行文件的用户开始现在 )到一个新的应用领域的可执行文件。 CachePath必须是用户特定的,如用户临时目录。

这样一来,每个用户将创建您的应用程序加载的所有组件的副本。 但是你必须要清理自己复制的文件的照顾。

所有您需要做的就是确保应用程序得到由新包装可执行启动。



Answer 2:

大多数更新的具有执行主应用程序的更新引导程序的可执行文件。

我们的想法是运行引导程序,而不是您的应用程序。 然后如果需要的话,实际启动应用程序之前,引导程序应用任何更新。

另一种方法(我从来没有尝试过,这只是一个线索)是使用影子组件 。 概念是“复制”的文件汇编,以避免在使用中锁定文件。

最后,你可以看看的ClickOnce它可以很容易地创造自我更新的应用程序,如果你接受这个机制的弊端。



Answer 3:

那么,Windows 允许重新命名相应的文件,即使他们都在使用。 所以,你可以重命名为更新的文件,用新版本替换它们,并重新启动应用程序。

我猜你将不能够解决这个不改变更新机制。



Answer 4:

我猜你是直接来代替旧组件的下载组件。 比方说你有一个装配myprogram.dll。 首先下载新的更新后的DLL使用不同的名称(_myprogram.dll为例)。 在下载后,竞争将取代_myprogram.dll的myprogram.dll触发事件。 这个事件应该声明所有正在运行的进程止步于第一则更换组件。 更换时应采取的一个时刻。 你无法避免削减这一刻的服务。

编辑:

应该是会一直运行并检查更新的过程。 首先发送的文件的名称这一进程。 这一过程将现在它会下载例如5个文件。 这一过程应在下载一个预定义的名称格式(带下划线例如串联的话)的文件。 该过程完成下载5文件后这个过程应该杀死所有其他进程(或最好只涉及到下载的组件的过程),然后用较新的更换组件。 不是再次启动进程。



文章来源: Don't lock files of application while running