首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自FileVersionInfo的MSBuild输出

来自FileVersionInfo的MSBuild输出
EN

Stack Overflow用户
提问于 2015-06-24 17:16:32
回答 1查看 333关注 0票数 0

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

代码语言:javascript
复制
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。没什么区别。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-22 17:40:52

看起来这和MSBuild一点关系都没有。我认为它是CLR方法中的一个bug,它处理相对路径的方式。

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

代码语言:javascript
复制
if (!File.Exists(fileName))
{
  new FileIOPermission(FileIOPermissionAccess.Read, FileVersionInfo.GetFullPathWithAssert(fileName)).Demand();
  throw new FileNotFoundException(fileName);
}

不抛出任何异常,因此该位对相对路径很满意。

但是当fileName进入到Microsoft.Win32.UnsafeNativeMethods中的API方法时,它还没有被识别出来:

代码语言:javascript
复制
int fileVersionInfoSize = Microsoft.Win32.UnsafeNativeMethods.GetFileVersionInfoSize(fileName, out handle);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31032968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档