C# 如何验证Windows VC++;Unix系统上的动态链接库
我有一个解决方案,主要是C#,但有一些VC++项目,它是通过我们的标准发布过程(Unix机器上的perl和bash脚本)推出的。目前的计划是在DLL和EXE版本通过过程时验证它们。设置所有版本控制,使文件版本的格式为C# 如何验证Windows VC++;Unix系统上的动态链接库,c#,unix,visual-c++,deployment,versioning,C#,Unix,Visual C++,Deployment,Versioning,我有一个解决方案,主要是C#,但有一些VC++项目,它是通过我们的标准发布过程(Unix机器上的perl和bash脚本)推出的。目前的计划是在DLL和EXE版本通过过程时验证它们。设置所有版本控制,使文件版本的格式为$Id:$(冒号和第二个美元之间应为git提交哈希),产品版本的格式为$Hudson Build:$(冒号和第二个美元之间应为表示Hudson Build详细信息的字符串) 目前,该系统在C#项目中运行得非常好,因为该版本信息以普通字符串形式存储在编译代码中(您可以直接使用unixs
$Id:$
(冒号和第二个美元之间应为git提交哈希),产品版本的格式为$Hudson Build:$
(冒号和第二个美元之间应为表示Hudson Build详细信息的字符串)
目前,该系统在C#项目中运行得非常好,因为该版本信息以普通字符串形式存储在编译代码中(您可以直接使用unixstrings
命令并查看版本信息);问题是VC++项目没有将此信息作为字符串公开(我使用windows系统验证版本信息是否正确设置),因此我不确定如何在unix系统上提取版本。有什么建议吗
假设您的DLL中有一个访问器来访问需要验证的信息,您可以编写一个小程序,在该程序下运行,并将必要的信息输出到标准输出。维基百科的标题下有一个这样的示例程序
另一个选项是找出MSVC++是如何编码这些信息的,以便您可以使用标准unix工具对其进行解码或查询。Windows可执行文件和共享库(DLL)将版本信息编码为二进制数据() 看一看问题,看看可以用来查询版本信息的win32 API。尽管你需要对代码做一些小的修改。和API应该在句柄中传递给您想要其版本信息的EXE/DLL(已加载到内存中)。传入NULL将获取与调用此代码的EXE关联的版本信息(这不是您想要的)
您需要调用在磁盘上加载EXE或DLL文件并获取其句柄,然后将此句柄作为hModule参数传递给上述API函数。并且在获得所需版本信息后,还可以将所需信息打印到控制台。任何不能简单使用包含
$Id:$
的字符串的原因-如下所示:
const char version[] = "$Id: $"
当然,您有两个版本ID,但它们来自同一个源。Windows上本机编译代码的版本信息以二进制格式存储在UTF-16(即宽字符串)中。您仍然可以使用
strings
命令,但是您需要告诉它在找到宽字符串之前使用-el
选项查找宽字符串
例如,在我的系统上,C:\Windows\notepad.exe上的RMB>属性提供的文件版本为5.1.2600.5512(xpsp.080413-2105)
。我将它复制到Linux框中,正如您所说,strings
找不到带有默认标志的字符串
$ strings notepad.exe | grep xpsp
$
但如果您设置了编码,结果很好:
$ strings -e l notepad.exe | grep xpsp
5.1.2600.5512 (xpsp.080413-2105)
我在考虑葡萄酒的选择,不幸的是这不可行。不幸的是,解码信息是我必须解决的问题。我的msbuild foo很低(在VS2008上,vcproj文件不是真正的msbuild项目),因此问题变成如何在生成时将
$Id:$
扩展到提交散列。我的Git fu很低,但是VS2008有一个预构建命令,允许您运行一个可执行文件,将ID扩展到提交散列。第二个问题是问VERSIONINFO资源是如何构建的。哦,我很高兴我没有时间在第一个方面做任何其他工作!谢谢你的简单解决方案。