如何部署不断变化的DLL?

时间:2011-12-19 16:45:25

标签: c# .net vb.net deployment dll

我创建了几个使用我自己的DLL的小应用程序。问题是,这个DLL不断变化。我目前解决这个问题的方法是,我在类库解决方案中有一个Setup项目,用于创建和注册DLL。在我的所有应用程序中,我必须打开解决方案并重新引用新创建/注册的DLL。 然后我必须重新编译他们的安装项目,卸载旧的应用程序,然后重新安装新的应用程序。

必须有一个更好的方法,我只是不确定,因为我对这一切都很新。我已经查看了ClickOnce,但我认为这不会解决我的问题,因为我无法发布类库。我已经研究过检查版本号但是我必须做错了,因为它也不起作用。

据我所知,一旦创建了一个DLL并在应用程序中使用它,就不应该触及它。在这种情况下我没有这个选择。它不断更新。完成。

那么,有更好的方法吗?我们将非常感谢指南或相关问题/答案/论坛的指导。

编辑:DLL在运行时不会不断变化,但它会不断发展,以便在其他应用程序中提供更多功能和细节。另外,我想我应该提到的一件大事是公共界面不断变换 - 通常会添加新方法。

4 个答案:

答案 0 :(得分:5)

确保对DLL的引用指定SpecificVersion = false。然后将每个新版本部署到GAC中,这应该可以解决问题。 最后,您还可以使用Binding Redirection手动强制修改版本。

答案 1 :(得分:1)

您可以尝试的解决方案是为您的项目使用单一解决方案,并在需要的任何地方引用该项目。

答案 2 :(得分:0)

查看NuGet

您可以设置一个内部Nuget存储库(实际上只是一个存储nupkg文件的文件夹。)然后,当您构建新的DLL时,您可以根据需要在工作室中更新应用程序。这将确保它具有最新版本。除非您正在修复的DLL中存在错误,否则它们不应该需要重新部署。

答案 3 :(得分:0)

一种解决方案如下:

  • 将接口与实现物理分离。例如AssemblyA是接口,应用程序(AssemblyB说)在编译时只知道接口。实现(AssemblyC)当然也知道/引用AssemblyA。关键是AssemblyB没有引用AssemblyC。这将要求您使用IoC容器(如MS Unity 2.0,但还有许多其他容器),以便在运行时解析和实例化您的混凝土。
  • 编写一个更新过程,找到新的AssemblyC.dll,替换本地副本,并使用反射和IoCContainer按照您需要的时间间隔“加载”新实现,通常是app启动。

以上依赖于您的界面稳定。如果不是,您可以写一个(更多)稳定的Facade