كيف يمكنني الحصول على DateTime الحالي من Precompiler في C#؟

StackOverflow https://stackoverflow.com/questions/419507

  •  03-07-2019
  •  | 
  •  

سؤال

في C# 3.0، لدي خاصية من المفترض أن تحتوي على إصدار الفئة.رقم الإصدار هو ببساطة تاريخ ووقت التجميع.الآن لدي الكود التالي:

public DateTime Version
{
    get { return DateTime.UtcNow; }
}

من الواضح أن هذا خطأ لأن هذه الخاصية تُرجع لي التاريخ والوقت الحاليين. لذلك، يمكن للمترجم المسبق مطبعة DateTime في وقت الترجمة؟ في هذه الحالة، يمكنني أن أفعل شيئًا مشابهًا لما يلي.

public DateTime Version
{
    get { return new DateTime("PRECOMPILER DATE"); }
}
هل كانت مفيدة؟

المحلول

وليس لديها C # مفهوم وحدات الماكرو. ومع ذلك، يمكنك استخدام أدوات أخرى في حياتك بناء النصي (csproj / نانت / الخ) لمعالجة المصدر قبل أن يجمع. أنا استخدم هذا، على سبيل المثال، لتعيين رقم المراجعة لمراجعة SVN الحالي.

وثمة خيار رخيص هو الحدث ما قبل بناء (يمكنك القيام بذلك عن طريق الحوار خصائص المشروع في VS): أساسا ملف الخفافيش التي يتم تشغيلها قبل بناء؛ أنت ثم يمكن النصي مهما كانت التغييرات التي تحتاج إليها. وثمة خيار أكثر تطورا هو بناء المهام.

وعلى سبيل المثال، مكتبة فائدة هنا تشمل مهمة Time ومهمة FileUpdate. يجب أن (نظريا) من الممكن سلسلة اثنين معا لمحاكاة ما تحتاجه.

وشخصيا، فما استقاموا لكم فاستقيموا استخدام تفاصيل [AssemblyVersion] بدلا من الوقت - إذا قمت بربط هذا النظام للسيطرة على المصدر، وهذا يجعل من السهل جدا العثور على نسخة المخالف، حتى لبلدي نسخة SVN، وبعد ذلك استخدام (في بلدي بناء مسقطة):

<!-- See http://msbuildtasks.tigris.org -->
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
...
<SvnInfo LocalPath=".">
  <Output TaskParameter="Revision" PropertyName="BuildRev" />
</SvnInfo>
...
<FileUpdate Files="Path\To\My\AssemblyInfo.cs"
    Regex='(\[\s*assembly:\s*AssemblyVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
    ReplacementText='$1.$2.$(BuildRev)$5' />
<FileUpdate Files="Path\To\My\AssemblyInfo.cs"
    Regex='(\[\s*assembly:\s*AssemblyFileVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
    ReplacementText='$1.$2.$(BuildRev)$5' />

والآن لي التجميع الإصدار هو الصحيح، بما في ذلك إصدار الملف الذي يتم الإبلاغ عنه من قبل نظام التشغيل.

نصائح أخرى

ويمكنك إستعادة ذلك من دلل نفسه ( المصدر: codinghorror )

   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;
    }

وليس هناك ما يعادلها من أجل التوجيه المعالج __TIME__ في C #، وأفضل ما يمكن القيام به هو الحصول على البرلمان الحالي والحصول على تاريخ الإنشاء، فإنه سوف تحتوي على وقت الترجمة. انظر هنا

وأنا لا أعتقد أن هناك طريقة للقيام بذلك في C # - غير مسموح C ++ أسلوب تعريفات الماكرو explictly

هل يمكن العمل حوله باستخدام إما تاريخ التعديل الأخير للمجلس، أو يحتمل أن تشمل ملف نصي كمصدر جزءا لا يتجزأ من وإضافة إجراءات بناء العرف أن يكتب التاريخ / الوقت الحالي فيه.

وليس هناك المعالج __TIME__ التوجيه، ولكن هناك أشياء أخرى يمكن استخدامها، مثل الوقت إنشاء الجمعية. هل يمكن أن تنظر أيضا استخدام استبدال الكلمة من نظام التحكم المصدر ($ $ التسجيل في التخريب).

ال يبني يمكن استرجاع الرقم من البيانات التعريفية للتجميع، ويمكن ضبطه ليتوافق مع تاريخ البناء.

عادةً سوف تجد أو تنشئ إدخالاً في ملف AssemblyInfo.cs.عندما يتم إنشاء مشروعك باستخدام Visual Studio.مثال:

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

اقتباس للتوثيق على AssemblyVersionAttribute.(لقد كتبت بعض الأجزاء المهمة بالخط العريض)

يمكنك تحديد جميع القيم أو يمكنك قبول رقم الإنشاء الافتراضي أو رقم المراجعة أو كليهما باستخدام علامة نجمية ().على سبيل المثال ، [التجميع: التجميع ("2.3.25.1")] يشير إلى 2 كإصدار رئيسي ، 3 كإصدار ثانوي ، 25 كرقم بناء ، و 1 كرقم المراجعة. رقم إصدار مثل [التجميع: التجميع ("1.2.")] يحدد 1 كإصدار رئيسي ، 2 كإصدار ثانوي ، ويقبل أرقام البناء والمراجعة الافتراضية. يحدد رقم الإصدار مثل [Assembly: AssemblyVersion ("1.2.15.*")] 1 كإصدار رئيسي ، 2 كإصدار ثانوي ، 15 كرقم بناء ، ويقبل رقم المراجعة الافتراضي. يزيد رقم البناء الافتراضي يوميًا.رقم المراجعة الافتراضي عشوائي.

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

يمكنك بعد ذلك استرداد رقم البنية باستخدام اسم التجميع.الإصدار ملكية.الأمثلة المقدمة من MSDN يجب أن تساعدك على المضي قدمًا.

رقم البناء الافتراضي هو عدد الأيام منذ 1/1/2000.

هذا السؤال لديه أيضًا شرح واضح حول كيفية استخدام هذا.

هل تبحث عن شيء مثل هذا:
(الحصول على هو تاريخ بناء الجمعية عبر صفحة، معلومات، بناء وعدد غير أيام منذ 2000/01/01)

         var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
        DateTime versionsDatum = new DateTime(2000, 1, 1);
        versionsDatum = versionsDatum.AddDays(version.Build);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top