Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MSBuild输出的FileVersionInfo_C#_.net_Msbuild - Fatal编程技术网

C# MSBuild输出的FileVersionInfo

C# MSBuild输出的FileVersionInfo,c#,.net,msbuild,C#,.net,Msbuild,我已经编写了一个自动生成过程,作为C中的.NET 4应用程序。我正在使用System.Diagnostics.process调用MSBuild.exe。正在构建的项目是用Delphi XE5编写的。然后我阅读了刚刚构建的可执行文件的版本: version = System.Diagnostics.FileVersionInfo.GetVersionInfo(fileName).FileVersion; 我不能使用Sytem.Reflection.Assembly类,因为它是一个Delphi应用

我已经编写了一个自动生成过程,作为C中的.NET 4应用程序。我正在使用System.Diagnostics.process调用MSBuild.exe。正在构建的项目是用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。没有区别。

似乎它与MSBuild没有任何关系。我认为这是CLR方法中的一个缺陷,它处理相对路径的方式

在调用GetVersionInfo之前,当前目录已更改。文件的路径是相对的。查看GetVersionInfo的反编译代码,它首先检查文件是否存在:

if (!File.Exists(fileName))
{
  new FileIOPermission(FileIOPermissionAccess.Read, FileVersionInfo.GetFullPathWithAssert(fileName)).Demand();
  throw new FileNotFoundException(fileName);
}
不会抛出异常,所以bit对相对路径感到满意

但当文件名传递到Microsoft.Win32.UnsafentiveMethods中的API方法时,它还未被识别:

int fileVersionInfoSize = Microsoft.Win32.UnsafeNativeMethods.GetFileVersionInfoSize(fileName, out handle);

在将文件名传递到GetVersionInfo之前,我将其转换为完整路径,现在它可以工作了。

Hmm,不,FileVersionInfo类非常简单,对运行时环境没有很强的依赖性。更可能的解释是,构建不顺利,可执行文件没有版本资源。易于使用资源管理器检查。可执行文件没有问题-它有正确的版本。