我已经编写了一个自动化的构建过程,作为.NET 4应用程序在C#中。我正在使用MSBuild.exe调用System.Diagnostics.Process。正在构建的项目是用Delphi XE5编写的。然后,我阅读了刚刚构建的可执行文件的版本:
version = System.Diagnostics.FileVersionInfo.GetVersionInfo(fileName).FileVersion;(我不能使用Sytem.Reflection.Assembly类,因为它是一个Delphi应用程序)。
如果我在控制台应用程序中这样做的话,效果会很好。版本返回为"1.2.3.4“。但是与Windows服务完全相同的代码,我得到一个空字符串,好像文件没有版本信息。在这两种情况下都有相同的操作系统凭据。
也许版本信息是从MSBuild构建的时候开始缓存的?但是为什么控制台和服务之间有区别呢?有什么想法,如何强制重新加载版本信息?我试过FileInfo.Refresh -没什么区别。
(我知道我可以编程地使用MSBuild,调用exe似乎更容易,而不必实现记录器。)
更新:--我将其更改为通过类Microsoft.Build.Execution.BuildManager,而不是通过MSBuild.exe,以编程方式调用MSBuild。没什么区别。
发布于 2015-07-22 17:40:52
看起来这和MSBuild一点关系都没有。我认为它是CLR方法中的一个bug,它处理相对路径的方式。
在调用GetVersionInfo之前,将更改当前目录。文件的路径是相对的。查看GetVersionInfo的反编译代码,它首先检查文件是否存在:
if (!File.Exists(fileName))
{
new FileIOPermission(FileIOPermissionAccess.Read, FileVersionInfo.GetFullPathWithAssert(fileName)).Demand();
throw new FileNotFoundException(fileName);
}不抛出任何异常,因此该位对相对路径很满意。
但是当fileName进入到Microsoft.Win32.UnsafeNativeMethods中的API方法时,它还没有被识别出来:
int fileVersionInfoSize = Microsoft.Win32.UnsafeNativeMethods.GetFileVersionInfoSize(fileName, out handle);在将fileName传递到GetVersionInfo之前,我将它转换为完整的路径,现在它可以工作了。
https://stackoverflow.com/questions/31032968
复制相似问题