Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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# 如何验证Windows VC++;Unix系统上的动态链接库_C#_Unix_Visual C++_Deployment_Versioning - Fatal编程技术网

C# 如何验证Windows VC++;Unix系统上的动态链接库

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

我有一个解决方案,主要是C#,但有一些VC++项目,它是通过我们的标准发布过程(Unix机器上的perl和bash脚本)推出的。目前的计划是在DLL和EXE版本通过过程时验证它们。设置所有版本控制,使文件版本的格式为
$Id:$
(冒号和第二个美元之间应为git提交哈希),产品版本的格式为
$Hudson Build:$
(冒号和第二个美元之间应为表示Hudson Build详细信息的字符串)

目前,该系统在C#项目中运行得非常好,因为该版本信息以普通字符串形式存储在编译代码中(您可以直接使用unix
strings
命令并查看版本信息);问题是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资源是如何构建的。哦,我很高兴我没有时间在第一个方面做任何其他工作!谢谢你的简单解决方案。