سؤال

وأريد أن تجعل (لتصحيح الأخطاء الداخلية / معلومات) تاريخ آخر تعديل للتجميع، ولذا فإنني سوف نعرف متى تم نشر موقع معين.

هل من الممكن الحصول عليها من خلال التأمل؟

وأحصل على نسخة من هذا القبيل:

Assembly.GetExecutingAssembly().GetName().Version.ToString();

وأنا أبحث عن شيء مماثل - لا أريد لفتح ملف فعلي، والحصول على خصائصه، أو شيء من هذا القبيل، وسأكون جعلها في الصفحة الرئيسية، ولا تريد أن نوع من النفقات العامة.

هل كانت مفيدة؟

المحلول

وسوف أكون ثاني الجواب pYrania ل:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location);
DateTime lastModified = fileInfo.LastWriteTime;

ولكن إضافة هذه:

ولقد ذكرت أنك لا تريد الوصول إلى نظام الملفات لأنه في الصفحة الرئيسية الخاصة بك وأنت لا تريد أن تجعل هذا النظام ملف إضافي ضرب لكل صفحة. حتى لا، فقط الوصول إليه مرة واحدة في الحدث تحميل التطبيق ومن ثم تخزينها كمتغير مستوى التطبيق.

نصائح أخرى

إذا كنت التقصير في مراجعة وبناء أرقام في AssemblyInfo:

[assembly: AssemblyVersion("1.0.*")]

ويمكنك الحصول على موعد تقريبي بناء مع:

Version version = typeof(MyType).Assembly.GetName().Version;
DateTime date = new DateTime(2000, 1, 1)
    .AddDays(version.Build)
    .AddSeconds(version.Revision * 2);

وماذا عن هذا؟

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location);
DateTime lastModified = fileInfo.LastWriteTime;

وبعض الناس يعتقدون ان الجمعية لا يحمل تاريخ بناء لكنك تعلم ما هي عليه الخطأ، يمكنك أن تكون استرداد الطابع الزمني رابط من PE رأس جزءا لا يتجزأ في الملف القابل للتنفيذ، مثل أيار التالية العمل (ط havn't اختبار رمز نفسي)

private DateTime RetrieveLinkerTimestamp()
{
    string filePath = System.Reflection.Assembly.GetCallingAssembly().Location;
    const int c_PeHeaderOffset = 60;
    const int c_LinkerTimestampOffset = 8;
    byte[] b = new byte[2048];
    System.IO.Stream s = null;

    try
    {
        s = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
        s.Read(b, 0, 2048);
    }
    finally
    {
        if (s != null)
        {
            s.Close();
        }
    }

    int i = System.BitConverter.ToInt32(b, c_PeHeaderOffset);
    int secondsSince1970 = System.BitConverter.ToInt32(b, i + c_LinkerTimestampOffset);
    DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0);
    dt = dt.AddSeconds(secondsSince1970);
    dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours);
    return dt;
}

وأو إذا كان التجمع في بنفسك النهج الأفضل لك نستخدم بعد بسيطة وسهلة

إضافة أدناه إلى ما قبل بناء سطر الأوامر الحدث:

echo %date% %time% > "$(ProjectDir)\Resources\BuildDate.txt"

إضافة هذا الملف ك الموارد، والآن لديك سلسلة "تاريخ بنية" في الموارد الخاصة بك.

ولقد اتخذت كل من الإجابات من هذا السؤال

وسوف الحل RetrieveLinkerTimestamp لا تعمل بعد مستحقات العام 2038 إلى استخدام int32 من 1970. أقترح استخدام ما يلي (على الرغم من أن هذا ربما لها حدودها أيضا):

IO.File.GetLastWriteTime(Reflection.Assembly.GetExecutingAssembly().Location)

وأنا لا أعتقد أن التجمع يحمل معلومات آخر تعديل لأن هذه هي سمة نظام التشغيل. وأعتقد أن الطريقة الوحيدة للحصول على هذه المعلومات من خلال التعامل مع الملف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top