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