3

我在正确设置程序集版本然后通过反射获取它时遇到问题。我找到了一种解决方法,但我仍然很好奇它为什么会这样......

我有一个类库项目,我正在加载它并通过以下代码读取版本:

var assembly = Assembly.LoadFrom(assemblyName);
var version= assembly.GetName().Version;

我得到了一个很好的结果:

assembly {AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null}
version  "1.0.0.0"

但是现在我已经在 Class Library 项目中将 Assembly version 和 File version 字段的值更改为 2.0.0.0。我已经编译了它并运行了 IL DASM 来比较这两个库。

在 IL DASM 的任何地方,即在主窗口中,在 Manifest 中,在 Metainfo 中,我都看到我的新库有 2.0.0.0 版本,而之前的库有 1.0.0.0,所以我很高兴一切都是正确的。

但后来我回到我的应用程序,我已经加载了版本 2.0.0.0 的程序集,结果如下:

assembly {AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null}
version  "1.0.0.0"

所以反射并没有给我带来好的版本价值。解决方法是使用 FileVersionInfo 类:

FileVersionInfo.GetVersionInfo(assemblyName).FileVersion;

现在我得到了正确的结果。

我的问题是:我还需要在我的类库项目中进行哪些更改才能通过反射机制检索一个好的版本?为什么 IL DASM 显示的是正确的版本而反射不是?我一直认为 IL DASM 在后台利用反射,但现在在我看来

感谢您的所有回答。

4

1 回答 1

-1

好的,我已经设法解决了。问题出在 Assembly 类的加载方法上。

我正在使用带有 DLL 完整路径的 Assembly.LoadFrom 作为参数。我已经意识到,当我使用 2.0.0.0 版本加载我的库时,Assembly.LoadFrom 正在返回我的第一个库,我已经通过指向库版本 1.0.0.0 而不是 2.0.0.0 的位置的 CodeBase 属性对其进行了验证.

我已将加载代码更改为 Assembly.LoadFile,现在它可以正常工作了。

var assembly = Assembly.LoadFile(assemblyName);
于 2013-05-07T14:17:03.763 回答