Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果仅更改了版本号或修订号,则找到GAC部件_C#_.net_Versioning_.net Assembly_Gac - Fatal编程技术网

C# 如果仅更改了版本号或修订号,则找到GAC部件

C# 如果仅更改了版本号或修订号,则找到GAC部件,c#,.net,versioning,.net-assembly,gac,C#,.net,Versioning,.net Assembly,Gac,我对CLR如何处理程序集绑定和从GAC加载(如果版本号和版本号发生更改)有疑问。组件有四个部分[主要][次要][构建][修订]。我知道,如果主版本和次版本发生更改,则需要发布者策略从GAC查找程序集的较新版本。如果只是版本号或修订号被更改了怎么办?在我下面的场景中,它不适用于构建和修订更新 在我的应用程序中,我的程序集信息为[1.0.*],因此TFS在每次生成时都以增量方式使用[1.0.5414.23455]号生成程序集。每天TFS都会生成项目,并生成具有增量生成号和修订号的部件。这是预期的行为

我对CLR如何处理程序集绑定和从GAC加载(如果版本号和版本号发生更改)有疑问。组件有四个部分[主要][次要][构建][修订]。我知道,如果主版本和次版本发生更改,则需要发布者策略从GAC查找程序集的较新版本。如果只是版本号或修订号被更改了怎么办?在我下面的场景中,它不适用于构建和修订更新

在我的应用程序中,我的程序集信息为[1.0.*],因此TFS在每次生成时都以增量方式使用[1.0.5414.23455]号生成程序集。每天TFS都会生成项目,并生成具有增量生成号和修订号的部件。这是预期的行为,正如我在AssemblyInfo文件中指出的通配符[1.0.*]

现在,我有了基于我的应用程序版本[1.0.5414.23455]构建的客户端应用程序。我正在使用安装程序将我的应用程序部署到GAC。现在,如果GAC有应用程序集版本[1.0.5414.23455],客户端应用程序运行良好,但如果我在GAC中安装新版本(技术上没有任何更改,只是新的夜间构建)[1.0.5414.23456],客户端应用程序将不会加载此新版本

我参考了一些微软的博客/文档,发现只要主数字和次数字相同,客户端应用程序就应该能够从GAC加载程序集。从GAC定位部件时,版本号和修订号不是强制性检查

版本号和修订号的更改对从GAC定位组件没有任何影响,这是否正确


提前感谢。

为了避免在GAC上部署的较新组件版本的编译复杂性,您可以在web.config或app.config中使用
bindingRedirect
,如:

 <runtime>
    <generatePublisherEvidence enabled="false" />
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="MyComponent.Web.UI" publicKeyToken="121fae78165ba3d4" />
        <bindingRedirect oldVersion="1.0.5414.23455" newVersion="1.0.5414.23455" />
      </dependentAssembly> ...

...
请注意,属性oldVersion还表示要替换的版本范围
oldVersion=“1.0.0.35-1.0.1016.35”
,属性newVersion表示替换版本
newVersion=“2.0.1205.35”

根据您的问题,我们为什么需要
bindingRedirect

程序集的依赖项是程序集元数据的一部分,您可以使用称为gacutil的东西(它是.NET SDK工具的一个工具部分)或下面使用.NET Reflector看到这一点。由于引用及其版本是程序集的一部分,因此需要编译或更改app.config引用才能引用新版本


如何对程序集进行强名称命名?使用强名称密钥文件和通过Visual Studio属性分配的标准方式。所有4个数字都是相关的并经过检查。因此,仅仅更改构建或修订就足以迫使您使用bindingRedirect或publisher策略。你永远不想在GAC中存储一个自动生成版本号的程序集,这会带来太多的污染和麻烦。仅在用户机器上使用GAC。看看“语义版本控制”。是的,我知道这一点,我在问题中提到了abt发布者策略。我特别想知道的是,是否只是版本号和修订号的更改导致GAC程序集加载失败。很可能您没有针对新版本编译所有组件,这可能会造成差异。如果技术上没有更改,为什么需要编译。由于TFS夜间版本,程序集刚刚获得新版本号和修订号。仅此而已,没有一行代码更改。为什么应该要求客户端重新编译他们的应用程序,而不进行任何或微小的更改。@Dotnet_Dev我用其他详细信息更新了我的答案。即使我在AssemblyInfo.cs文件中提到[1.0.*],它是否在从GAC定位时引用了版本号和修订号…这意味着它的版本号和修订号是自动生成的,而不是特定的。。。