【问题标题】:How can I tell my ASP.NET application to use any version of a strongly named assembly?如何告诉我的 ASP.NET 应用程序使用任何版本的强命名程序集?
【发布时间】:2009-05-14 08:16:50
【问题描述】:

我有一个使用自定义 .NET 库(一个 .DLL 文件)的 ASP.NET 应用程序。该 .DLL 文件是强命名的。该库有频繁的小更新,我希望能够在不重新编译应用程序的情况下更新此 .DLL。该应用程序必须进行预编译,因为我不想将它的源代码提供给我的客户(并不是说它不能被反编译,但这不是重点)。

这可以以某种方式完成吗?目前我只是收到一个错误,即 .DLL 的版本错误。

【问题讨论】:

    标签: .net asp.net strongname


    【解决方案1】:

    您可以为他们提供更新的配置文件以配合新的 dll。此配置需要有一个自定义版本策略,将请求从一个 dll 重定向到另一个。请参阅this article 了解更多信息。


    实际上this article 有更多关于整个过程的信息以及您可以定义版本策略的不同级别。

    【讨论】:

    • 不错,但我想我必须为我安装的每个版本的 .DLL 提供版本重定向,对吧?如果我可以复制新的 .DLL 并运行它会更好。但在最坏的情况下,这也可以。
    • 不幸的是,我认为这就是需要以这种方式完成的重点。它迫使开发人员确认使用新版本的 dll 已经过测试并且不提供任何意外行为。另一种选择是它总是加载最新版本,而你又回到了 C 风格编程的 dll 地狱,其中一个应用程序的更新可能会破坏另一个不相关的应用程序。
    • 由于这个 DLL 是我的应用程序本地的(不在 GAC 或系统文件夹中),任何地狱都将是我一个人的。但是,是的,我想冒险。 :P 好的,那我想我会这样做......
    【解决方案2】:

    您可以使用反射在运行时动态加载程序集。 Activator.CreateInstance 应该可以解决问题。

    IMyInterface myObject = (IMyInterface)Activator.CreateInstance( "TheAssemblyName",
                                                "TheTypeName",
                                                null )
    

    如果您使用的是 .Net 3.5,则可以使用插件和可扩展性。看看这里: http://msdn.microsoft.com/en-us/library/bb384241.aspx

    【讨论】:

    • 不,我不能动态加载程序集,因为我到处都在使用它。我不仅要重写一半的应用程序,而且以这种方式使用它也会变得很糟糕。并且将其全部迁移到 AddIn 架构也很困难,因为 .DLL 有数百个我必须使用的类。
    • 哎呀,这太容易了,现实世界永远不会太容易:)
    【解决方案3】:

    也许你可以把强类型的dll放在gac中,最后做dll版本控制,这样旧版本总是可用的,新版本只会被新编译的应用程序使用,而旧的应用程序将被使用它们的旧 dll 版本,直到它们被再次编译和部署。

    希望这可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      相关资源
      最近更新 更多