繁体   English   中英

替换 C# .NET 应用程序使用的 Windows 共享文件夹上的 DLL

[英]Replacing a DLL on a Windows shared folder that is used by a C# .NET application

我们有一个企业管理软件,我们的客户将其部署到 Windows 网络共享文件夹中,来自多个终端服务器的多个用户从中启动我们的程序。

我们试图实现的是一种在用户使用程序来应用补丁修复错误时替换 DLL 的方法。 目前奇怪的是,我们能够重命名旧的 DLL 以替换和应用新的 DLL,而不会对正在使用的文件产生任何错误。

这给我们带来了两个问题:

  • 如果同一应用程序的实例仍在使用旧 DLL,则应用程序不会加载新 DLL(我认为这是https://en.wikipedia.org/wiki/DLL_Hell#Shared_in-memory_modules的情况)
  • 在替换之前运行的应用程序会向左和向右抛出异常,因为它们只是部分加载(延迟加载),并且何时需要查看文件中缺少的部分,IL 代码不会不再匹配内存中的内容。

最重要的是,我认为我们正在做一些我们不应该做的事情:重命名正在使用的东西。

到目前为止,我发现的可能解决方案有两个:

  • 使用启用了卷影复制的新 AppDomain 启动应用程序,但这并不可靠,因为每个客户端都有自己的环境,我们可能会遇到意外的权限错误或类似的问题
  • 加载组件而不锁定它们。 在本笔记中,我们研究了使用反射(我们实际上在某种程度上使用了反射),但我们不确定如何通过 DLL 已在项目中引用的反射程序集加载(我们有多个 DLL 引用其他 DLL正在引用其他 DLL 等....)。

你们中有人对如何安全地克服这个问题有任何其他想法吗? 或者如何通过反射解决我上面提到的最后一点?

您可以尝试穷人版的蓝/绿部署。

将您的应用程序文件部署到两个相同的文件夹中

\\SomeMachine\d$\MyApp\Green
\\SomeMachine\d$\MyApp\Blue

现在在根文件夹中放置一个快捷方式,如下所示:

\\SomeMachine\d$\MyApp\MyApp.lnk

从指向绿色文件夹中 .exe 的快捷方式开始。

告诉您的用户始终使用快捷方式启动应用程序(而不是导航到绿色或蓝色文件夹并在那里启动它)。

需要更新 DLL 时,请执行以下过程:

  1. 在 Blue 文件夹中进行修改
  2. 在 Blue 文件夹中执行任何需要的测试。
  3. 一旦您确定它有效,更新MyApp.lnk快捷方式以指向 Blue。

在您更新之前启动其应用程序的用户将继续点击绿色文件夹,直到他们退出应用程序。 任何重新启动应用程序的人都会点击蓝色文件夹。

下次您必须更新 DLL 时,请反转该过程。 在 Green 文件夹中进行修改,然后更新快捷方式以指向 Green。

这样,您总是会更新一个没人使用的文件夹,然后通过快捷方式使其可用。 只要人们不时退出应用程序,您就应该能够无缝部署。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM