C# 如何在C中访问dll build datetime#

C# 如何在C中访问dll build datetime#,c#,datetime,dll,build,C#,Datetime,Dll,Build,有没有办法从C#访问dll的生成日期时间 在dll的正式发布之间,我希望能够以某种方式存储dll的构建时间/日期,以便检查当前执行的构建是否是我期望的构建。我正在处理外接程序的调试版本和发布版本,我很容易忘记当前使用的是哪一个,尤其是在一些开发、测试和预生产机器上。我希望能够转到我的“关于”框并在那里显示它 蒂亚, Paolo使用组件信息描述,类似的内容您不想使用组件版本号的最后一位的原因是什么?您可以通过Version.Revision属性来访问它。在我看来,这是一种非常简单的识别构建的方法。

有没有办法从C#访问dll的生成日期时间

在dll的正式发布之间,我希望能够以某种方式存储dll的构建时间/日期,以便检查当前执行的构建是否是我期望的构建。我正在处理外接程序的调试版本和发布版本,我很容易忘记当前使用的是哪一个,尤其是在一些开发、测试和预生产机器上。我希望能够转到我的“关于”框并在那里显示它

蒂亚,
Paolo

使用组件信息描述,类似的内容

您不想使用组件版本号的最后一位的原因是什么?您可以通过
Version.Revision
属性来访问它。在我看来,这是一种非常简单的识别构建的方法。

您可以使用FileInfo类

FileInfo file = new FileInfo(pathToDll);
DateTime dllCreateTime = file.CreationTime;

您可以使用
TimeDateStamp
字段,该字段表示链接器创建图像的日期和时间。该值很有用,因为它独立于文件系统中文件的日期/时间

相应的.NET 4.0代码可能与以下内容有关:

using System;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
using System.IO;

namespace GetPeLinkTime {
    class Program {
        static void Main (string[] args) {
            if (args.Length != 1) {
                Console.WriteLine ("Usage:" + Environment.NewLine + "    GetPeLinkTime ExePathToExamine");
                return;
            }
            string filePath = args[0];

            FileStream file = File.OpenRead (filePath);
            using (var mmf = MemoryMappedFile.CreateFromFile (file, null, 
                                                              file.Length,
                                                              MemoryMappedFileAccess.Read,
                                                              null, HandleInheritability.None, false)) {
                NativeMethods.IMAGE_DOS_HEADER dosHeader = new NativeMethods.IMAGE_DOS_HEADER ();
                using (var accessor = mmf.CreateViewAccessor (0,
                                                              Marshal.SizeOf (dosHeader),
                                                              MemoryMappedFileAccess.Read)) {
                    accessor.Read<NativeMethods.IMAGE_DOS_HEADER>(0, out dosHeader);
                    if (dosHeader.e_magic != NativeMethods.IMAGE_DOS_SIGNATURE) {
                        Console.WriteLine ("The input file is not an Executable file.");
                        return;
                    }
                }
                int signature = 0;
                NativeMethods.IMAGE_FILE_HEADER imageFileHeader = new NativeMethods.IMAGE_FILE_HEADER();
                using (var accessor = mmf.CreateViewAccessor (dosHeader.e_lfanew,
                                                              Marshal.SizeOf (signature) + Marshal.SizeOf (imageFileHeader),
                                                              MemoryMappedFileAccess.Read)) {
                    signature = accessor.ReadInt32 (0);
                    if (signature != NativeMethods.IMAGE_NT_SIGNATURE) {
                        Console.WriteLine ("The input file is not a Program Executable file.");
                        return;
                    }
                    accessor.Read<NativeMethods.IMAGE_FILE_HEADER> (Marshal.SizeOf (signature), out imageFileHeader);
                }
                // convert a Unix timestamp to DateTime
                DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
                TimeSpan localOffset = TimeZone.CurrentTimeZone.GetUtcOffset (origin);
                DateTime originUTC = origin.AddHours(localOffset.Hours);
                DateTime linkTime = originUTC.AddSeconds ((double)imageFileHeader.TimeDateStamp);
                Console.WriteLine ("Link time of the file '{0}' is: {1}", filePath, linkTime);
            }
        }
    }
    internal static class NativeMethods {
        internal const int IMAGE_DOS_SIGNATURE = 0x5A4D;    // MZ
        internal const int IMAGE_NT_SIGNATURE = 0x00004550; // PE00

        [StructLayout (LayoutKind.Sequential)]
        internal struct IMAGE_DOS_HEADER {  // DOS .EXE header
            internal short e_magic;         // Magic number
            internal short e_cblp;          // Bytes on last page of file
            internal short e_cp;            // Pages in file
            internal short e_crlc;          // Relocations
            internal short e_cparhdr;       // Size of header in paragraphs
            internal short e_minalloc;      // Minimum extra paragraphs needed
            internal short e_maxalloc;      // Maximum extra paragraphs needed
            internal short e_ss;            // Initial (relative) SS value
            internal short e_sp;            // Initial SP value
            internal short e_csum;          // Checksum
            internal short e_ip;            // Initial IP value
            internal short e_cs;            // Initial (relative) CS value
            internal short e_lfarlc;        // File address of relocation table
            internal short e_ovno;          // Overlay number
            internal short e_res1;          // Reserved words
            internal short e_res2;          // Reserved words
            internal short e_res3;          // Reserved words
            internal short e_res4;          // Reserved words
            internal short e_oemid;         // OEM identifier (for e_oeminfo)
            internal short e_oeminfo;       // OEM information; e_oemid specific
            internal short e_res20;         // Reserved words
            internal short e_res21;         // Reserved words
            internal short e_res22;         // Reserved words
            internal short e_res23;         // Reserved words
            internal short e_res24;         // Reserved words
            internal short e_res25;         // Reserved words
            internal short e_res26;         // Reserved words
            internal short e_res27;         // Reserved words
            internal short e_res28;         // Reserved words
            internal short e_res29;         // Reserved words
            internal int e_lfanew;          // File address of new exe header
        }
        [StructLayout (LayoutKind.Sequential)]
        internal struct IMAGE_FILE_HEADER {
            internal short Machine;
            internal short NumberOfSections;
            internal int TimeDateStamp;
            internal int PointerToSymbolTable;
            internal int NumberOfSymbols;
            internal short SizeOfOptionalHeader;
            internal short Characteristics;
        }
        //struct _IMAGE_NT_HEADERS {
        //    DWORD Signature;
        //    IMAGE_FILE_HEADER FileHeader;
        //    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
        //}
        //struct _IMAGE_NT_HEADERS64 {
        //    DWORD Signature;
        //    IMAGE_FILE_HEADER FileHeader;
        //    IMAGE_OPTIONAL_HEADER64 OptionalHeader;
        //}
    }
}
使用系统;
使用System.IO.MemoryAppedFile;
使用System.Runtime.InteropServices;
使用System.IO;
命名空间GetPeLinkTime{
班级计划{
静态void Main(字符串[]参数){
如果(args.Length!=1){
Console.WriteLine(“用法:“+Environment.NewLine+”GetPeLinkTime exepath-toexamine”);
返回;
}
字符串filePath=args[0];
FileStream file=file.OpenRead(filePath);
使用(var mmf=MemoryMappedFile.CreateFromFile)(文件,null,
文件长度,
MemoryMappedFileAccess.Read,
null,HandleInheritability.None,false){
NativeMethods.IMAGE_DOS_HEADER dosHeader=新的NativeMethods.IMAGE_DOS_HEADER();
使用(var accessor=mmf.CreateViewAccessor(0,
Marshal.SizeOf(dosHeader),
MemoryMappedFileAccess.Read){
accessor.Read(0,out-dossheader);
if(dosHeader.e_magic!=NativeMethods.IMAGE_DOS_签名){
Console.WriteLine(“输入文件不是可执行文件”);
返回;
}
}
int签名=0;
NativeMethods.IMAGE_FILE_HEADER imageFileHeader=新的NativeMethods.IMAGE_FILE_HEADER();
使用(var accessor=mmf.CreateViewAccessor)(dosHeader.e_lfanew,
Marshal.SizeOf(签名)+Marshal.SizeOf(imageFileHeader),
MemoryMappedFileAccess.Read){
签名=accessor.ReadInt32(0);
if(签名!=NativeMethods.IMAGE\u NT\u签名){
Console.WriteLine(“输入文件不是程序可执行文件”);
返回;
}
Read(Marshal.SizeOf(signature),out-imageFileHeader);
}
//将Unix时间戳转换为日期时间
日期时间原点=新的日期时间(1970,1,1,0,0,0);
TimeSpan localOffset=TimeZone.CurrentTimeZone.GetUtcOffset(原点);
DateTime originUTC=origin.AddHours(localOffset.Hours);
DateTime linkTime=originUTC.AddSeconds((双精度)imageFileHeader.TimeDateStamp);
Console.WriteLine(“文件{0}的链接时间为:{1}”,文件路径,链接时间);
}
}
}
内部静态类NativeMethods{
内部常量int IMAGE\u DOS\u签名=0x5A4D;//MZ
内部常量int IMAGE\u NT\u签名=0x00004550;//PE00
[StructLayout(LayoutKind.Sequential)]
内部结构映像\u DOS\u头{//DOS.EXE头
内部短e_magic;//幻数
内部短e_cblp;//文件最后一页上的字节
内部短e_cp;//文件中的页面
内部短e_crlc;//重新定位
内部短e_cparhdr;//段落中标题的大小
内部短e_minalloc;//所需的最少额外段落
内部短e_maxalloc;//需要的最大额外段落数
内部短e_ss;//初始(相对)ss值
内部短e_sp;//初始sp值
内部短e_csum;//校验和
内部短e_ip;//初始ip值
内部短e_cs;//初始(相对)cs值
内部短e_lfarlc;//重新定位表的文件地址
内部短e_ovno;//覆盖编号
内部短e_res1;//保留字
内部短e_res2;//保留字
内部短e_res3;//保留字
内部短e_res4;//保留字
内部短e_oemid;//OEM标识符(用于e_oeminfo)
内部短e_oeminfo;//OEM信息;e_oemid特定
内部短e_res20;//保留字
内部短e_res21;//保留字
内部短e_res22;//保留字
内部短e_res23;//保留字
内部短e_res24;//保留字
内部短e_res25;//保留字