使用 Visual Studio,如何防止网络共享上的发布项目被用户锁定?

Posted

技术标签:

【中文标题】使用 Visual Studio,如何防止网络共享上的发布项目被用户锁定?【英文标题】:With Visual Studio, how to Prevent a release project on a network share to be locked by users? 【发布时间】:2016-03-09 16:19:51 【问题描述】:

我用 C# 创建了一个在登录时启动的应用程序,以跟踪通过数千台计算机安装的软件。维护几乎是不可能的,因为可执行文件是从网络共享启动的,并且经常按预期锁定。

使用另一个可执行文件可以通过在访问主可执行文件之前查看 xml 文件的真/假布尔值来解决此问题:

AccessManager.exe --> XML, if true --> main.exe
                           if false, exit!

但我将不得不创建另一个项目。有什么办法可以避免吗?

编辑:数据库文件 (SQLite) 与主应用程序位于同一文件夹中。

【问题讨论】:

当然,为什么不呢。但是,如果有人离开大楼让程序运行,您将不得不等待一段时间。或者你可以重命名文件,锁定是文件数据,而不是目录条目。 由于某些原因,重命名并不总是有效。我偶尔可以删除它,但无法将其恢复。由于计算机仍在指向它,并且在完全释放文件方面存在一些延迟,因此共享上仍然存在此文件的影子。 好吧,不要删除,那是行不通的,因为这也会删除文件数据并且它被锁定。如果您无法诊断“某些原因”,那么切换到 ClickOnce 部署开始看起来不错。 也许我可以使用 accesmanager 类作为主要可执行文件并将其他任何内容放入 DLL 中以简化维护。我不熟悉 DLL,它可以工作吗? 【参考方案1】:

为什么没有一个命令脚本将应用程序复制到用户的 appdata 文件夹,然后从那里运行它?然后没有人会锁定可执行文件,当您更新它时,用户将在再次登录时获得最新版本。

顺便说一句,如果用户从网络共享运行时失去网络......不好。

【讨论】:

这可能是个好主意,但我们在复制文件时会被锁定。由于我们有数千台计算机,因此完成所有副本需要几个小时。目标是真正将文件(主 exe 和 DB 文件)保持在一起 您可以编写一个代理,在用户第一次登录时安装在他们的计算机上(再次登录到 appdata 文件夹)。代理会调用服务来获取可执行文件(想想 WCF)。该服务将使用静态字节数组来保存要传输的代码。它还将使用文件系统观察器,根据需要更新字节数组。这样,程序被锁定的唯一时间是在编译和复制期间,以及服务加载字节数组所需的短暂时间。

以上是关于使用 Visual Studio,如何防止网络共享上的发布项目被用户锁定?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止Visual Studio 2017添加对NugetFallbackFolder的引用

如何在 Visual Studio Code 中临时禁用“防止脏写”功能

如何防止 Visual Studio 警告缺少调试信息?

如何防止 Visual Studio 更改我的 csproj 格式

如何防止 Visual Studio 2010 在 C++ 中向我的项目添加大型 SQL 文件?

如何防止 Visual Studio 在 Web 项目中“发布”XML 文档文件?