可以从应用程序清单文件中删除版本号信息

时间:2014-07-12 09:38:58

标签: .net visual-studio-2013 .net-assembly

我创建了一个程序集,为第三方供应商的控件添加其他功能(他们知道这一点,我们一起解决了许可问题)。我当然没有意识到,visual studio嵌入了我的程序集在程序集清单文件中引用的所有程序集的详细信息(在本例中为版本号)。

我知道我可以打开此文件以使用Ildasm.exe查看该信息,并且对CodeProject的进一步研究表明我实际上可以继续编辑此文件。

这么简单的问题。是否可以安全地删除引用程序集的版本号信息或将它们设置为0.0.0.0,以便那些引用的程序集实际上与版本无关?

由于

1 个答案:

答案 0 :(得分:5)

术语很重要,听起来好像你实际上是在谈论一个"应用程序清单文件"。您无法使用ildasm.exe查看清单,它只允许您查看.NET程序集中的元数据和IL。令人困惑的是,它将元数据标记为" manifest"在其UI中。

是的,.NET程序集中的元数据包含版本号。你可以用ildasm.exe看到类似的东西:

.assembly extern ClassLibrary1
{
  .ver 1:0:5306:9013
}

不,您可以删除该版本号。当编译器从您添加到项目的引用程序集中读取[AssemblyVersion]时,它被嵌入。该版本号在.NET中非常重要,它确保您在运行时加载的程序集与您编译程序的程序集相同。如果版本不匹配,CLR将拒绝加载程序集。这是一个 DLL Hell 问题,它导致程序在DLL中的代码被更改时随机失败,而您不知道它并在您自己的代码中进行必要的更正以处理更改。

我给了你最好的[AssemblyVersion]示例,版本号如1.0.5306.9013是一个自动生成的版本。每次重建程序集时它都会更改,即使代码根本没有更改也是如此。如果您正在使用此供应商,则很难处理此问题。如果这是您要解决的问题,那么您应该与他们取得联系并说服他们不应该这样做。谈论"语义版本控制"。

CLR坚持确切的版本号匹配,但你可以说服它你知道更好。这需要在app.exe.config文件中使用<bindingRedirect>