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