MSBuild 输出的 FileVersionInfo

FileVersionInfo of output from MSBuild

我用 C# 编写了一个自动构建过程,作为 .NET 4 应用程序。我正在使用 System.Diagnostics.Process 调用 MSBuild.exe。正在构建的项目是用 Delphi XE5 编写的。然后我阅读了刚刚构建的可执行文件的版本:

version = System.Diagnostics.FileVersionInfo.GetVersionInfo(fileName).FileVersion;

(我不能使用 Sytem.Reflection.Assembly class 因为它是一个 Delphi 应用程序)。

如果我在控制台应用程序中执行此操作,效果会很好。该版本返回为例如“1.2.3.4”。但是与 Windows 服务完全相同的代码,我得到一个空字符串,就好像文件没有版本信息一样。两种情况下的 OS 凭据相同。

也许版本信息是从 MSBuild 构建时缓存的?但为什么控制台和服务之间存在差异?任何想法如何强制重新加载版本信息?我试过了 FileInfo.Refresh - 没有区别。

(我知道我可以以编程方式使用 MSBuild,调用 exe 似乎更容易,而无需实现记录器。)

更新: 我将其更改为通过 class Microsoft.Build.Execution.BuildManager 而不是 MSBuild.exe 以编程方式调用 MSBuild。没有区别。

似乎与 MSBuild 完全无关。我认为这是 CLR 方法中的一个错误,在它处理相对路径的方式上。

在调用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,现在它可以工作了。