【问题标题】:Redirecting Assembly versions to a different CLR/GAC将程序集版本重定向到不同的 CLR/GAC
【发布时间】:2011-08-01 12:42:15
【问题描述】:

我有一个关于 2 个 CLR 版本的问题,即 .NET 框架的第 2 版和第 4 版,它们使用不同的 GAC 位置。我构建了一个客户端应用程序,它引用了来自 v2 GAC (C:\Windows\Assembly) 的程序集“X”。我现在正在更新程序集“X”以在 .NET 框架的 v4 (C:\Windows\Microsoft.NET\assembly) 上运行,但是,我不想重新编译客户端应用程序。请注意,在安装到 v4 GAC 之前,程序集“X”已从 v2 GAC 中删除。

是否可以创建一个发布者策略文件,将曾经驻留在 CLR 版本 2 中的程序集重定向到 CLR 版本 4?如果有,这是如何实现的?

我已经搜索了 MSDN,并且了解到在 assemblyBinding 元素上有一个 applyTo 字段,您可以在其中指定 .NET 框架的版本,但这似乎涵盖了整个绑定。

我想要的是这样的:

<bindingRedirect oldVersion="1.0.0.0" .Net 2 newVersion="2.0.0.0" .Net 4/>

我在这里看到http://msdn.microsoft.com/en-us/magazine/dd727509.aspx,CLR v2.0 应用程序现在无法在 GAC 中看到 CLR v4.0 程序集。但是,您可以通过以下方式强制应用使用更新后的 CLR:

<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" />

那么将这与发布商政策相结合就足够了吗,还是有其他方法?

【问题讨论】:

    标签: c# .net visual-studio-2010 clr gac


    【解决方案1】:

    这里的决定因素是您的客户端应用程序在哪个版本的 CLR 下运行。如果它是 v2,那么您无能为力以使 v4 程序集可用甚至对其可见。如果它确实在 v4 CLR 下运行,那么它会首先自动尝试解析 v4 GAC 中的程序集引用。

    好消息是,您无需重新编译客户端应用即可实现这一目标。您可以通过将其添加到应用程序的配置文件中来强制它在 .Net 4 下运行:

    <configuration>
      <startup>
        <supportedRuntime version="v4.0" />
      </startup>
    </configuration>
    

    这应该会给你你想要的。

    【讨论】:

    • 谢谢;我们在该领域有客户,它们是在 GAC 中与程序集连接的,所以当我们发布新版本的程序集(通过替换,而不是添加)时,我们不想强迫他们针对新版本重新编译 - 因此为什么我们使用发布者策略程序集进行重定向。我们可以避免重新编译客户端应用程序,这很好;但是,这意味着我们现在需要确保客户端具有 app.config,并记得在我们按照您的描述发布新程序集时更新这些以支持 v4 运行时。如果发布商政策能够解决这个问题,那就太好了!
    • 有一个注册表设置,您可以通过它强制所有应用程序在最新的 CLR 下运行。请参阅此答案:stackoverflow.com/questions/2094694/…。不知道这对您是否可行,但它肯定会消除为每个客户端设置 App.config 的需要(当然,前提是您可以通过 GPO 或类似方式自动进行注册表设置!)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多