Saat ini saya memiliki aplikasi yang menampilkan nomor build di jendela judulnya. Itu bagus dan bagus kecuali itu tidak ada artinya bagi sebagian besar pengguna, yang ingin tahu apakah mereka memiliki versi terbaru - mereka cenderung menyebutnya sebagai "Kamis lalu" daripada versi 1.0.8.4321.
Rencananya adalah meletakkan tanggal pembuatan di sana sebagai gantinya - Jadi "App dibangun pada 21/10/2009" misalnya.
Saya kesulitan menemukan cara terprogram untuk menarik tanggal pembuatan sebagai string teks untuk digunakan seperti ini.
Untuk nomor build, saya menggunakan:
Assembly.GetExecutingAssembly().GetName().Version.ToString()
setelah mendefinisikan bagaimana itu muncul.
Saya ingin sesuatu seperti itu untuk tanggal kompilasi (dan waktu, untuk poin bonus).
Pointer di sini sangat dihargai (permisi pun jika perlu), atau solusi yang lebih rapi ...
sumber
Jawaban:
Jeff Atwood memiliki beberapa hal untuk dikatakan tentang masalah ini dalam Menentukan Build Date dengan cara yang sulit .
Metode yang paling dapat diandalkan ternyata mengambil cap waktu tautan dari header PE yang tertanam dalam file yang dapat dieksekusi - beberapa kode C # (oleh Joe Spivey) untuk itu dari komentar di artikel Jeff:
Contoh penggunaan:
UPDATE: Metode ini bekerja untuk .Net Core 1.0, tetapi berhenti bekerja setelah .Net Core 1.1 rilis (memberikan tahun acak dalam kisaran 1900-2020)
sumber
.AddHours()
agak hackish dan (saya pikir) tidak akan mempertimbangkan DST. Jika Anda menginginkannya dalam waktu lokal, Anda sebaiknya menggunakan pembersih itudt.ToLocalTime();
. Bagian tengah juga bisa sangat disederhanakan denganusing()
blok.Tambahkan di bawah ini untuk baris perintah acara pra-bangun:
Tambahkan file ini sebagai sumber daya, sekarang Anda memiliki string 'BuildDate' di sumber daya Anda.
Untuk membuat sumber daya, lihat Cara membuat dan menggunakan sumber daya di .NET .
sumber
Jalan
Seperti yang ditunjukkan oleh @ c00000fd dalam komentar . Microsoft mengubah ini. Dan sementara banyak orang tidak menggunakan versi terbaru dari kompiler mereka, saya curiga perubahan ini membuat pendekatan ini menjadi buruk. Dan walaupun ini adalah latihan yang menyenangkan, saya akan merekomendasikan orang-orang untuk menanamkan tanggal pembuatan ke dalam biner mereka melalui cara lain yang diperlukan jika penting untuk melacak tanggal pembuatan dari biner itu sendiri.
Ini dapat dilakukan dengan beberapa pembuatan kode sepele yang mungkin merupakan langkah pertama dalam skrip build Anda. Itu, dan fakta bahwa alat ALM / Build / DevOps banyak membantu dengan ini dan harus lebih disukai daripada yang lain.
Saya meninggalkan sisa jawaban ini di sini hanya untuk tujuan historis.
Cara baru
Saya berubah pikiran tentang ini, dan saat ini menggunakan trik ini untuk mendapatkan tanggal pembuatan yang benar.
Cara lama
Nah, bagaimana Anda menghasilkan angka membangun? Visual Studio (atau kompiler C #) benar-benar memberikan angka pembuatan dan revisi otomatis jika Anda mengubah atribut AssemblyVersion ke mis.
1.0.*
Apa yang akan terjadi adalah bahwa bangunannya akan sama dengan jumlah hari sejak 1 Januari 2000 waktu setempat, dan untuk revisi sama dengan jumlah detik sejak tengah malam waktu setempat, dibagi 2.
lihat Konten Komunitas, Nomor Pembuatan dan Revisi Otomatis
mis. AssemblyInfo.cs
SampleCode.cs
sumber
TimeZone.CurrentTimeZone.IsDaylightSavingTime(buildDateTime) == true
IMAGE_FILE_HEADER::TimeDateStamp
bidang ini diatur ke angka acak dan tidak lagi dicap waktu.Tambahkan di bawah ini untuk baris perintah acara pra-bangun:
Tambahkan file ini sebagai sumber daya, sekarang Anda memiliki string 'BuildDate' di sumber daya Anda.
Setelah memasukkan file ke Resource (sebagai file teks publik), saya mengaksesnya melalui
Untuk membuat sumber daya, lihat Cara membuat dan menggunakan sumber daya di .NET .
sumber
Salah satu pendekatan yang saya kagum belum ada yang disebutkan adalah menggunakan T4 Text Templates untuk pembuatan kode.
Pro:
Cons:
sumber
Constants.CompilationTimestampUtc
. Jika VS tidak menghasilkan file C # dengan kelas maka Anda perlu mencari cara untuk melakukannya, tetapi jawabannya tergantung pada (paling tidak) versi VS dan jenis file csproj, jadi itu adalah terlalu banyak detail untuk posting ini.Mengenai teknik menarik info tanggal / versi build dari byte header PE assembly, Microsoft telah mengubah parameter build default yang dimulai dengan Visual Studio 15.4. Default baru mencakup kompilasi deterministik, yang membuat stempel waktu yang valid dan nomor versi yang ditambahkan secara otomatis menjadi bagian dari masa lalu. Bidang cap waktu masih ada tetapi diisi dengan nilai permanen yang merupakan hash dari sesuatu atau lainnya, tetapi tidak ada indikasi waktu pembuatan.
Beberapa latar belakang rinci di sini
Bagi mereka yang memprioritaskan cap waktu yang berguna di atas kompilasi deterministik, ada cara untuk mengganti default baru. Anda dapat menyertakan tag dalam file .csproj dari kumpulan yang diminati sebagai berikut:
Pembaruan: Saya mendukung solusi template teks T4 yang dijelaskan dalam jawaban lain di sini. Saya menggunakannya untuk menyelesaikan masalah saya dengan bersih tanpa kehilangan manfaat dari kompilasi deterministik. Satu peringatan tentang hal itu adalah bahwa Visual Studio hanya menjalankan kompiler T4 ketika file .tt disimpan, bukan pada waktu membangun. Ini bisa menjadi canggung jika Anda mengecualikan hasil .cs dari kontrol sumber (karena Anda mengharapkannya dihasilkan) dan pengembang lain memeriksa kode. Tanpa resetting, mereka tidak akan memiliki file .cs. Ada paket di nuget (saya pikir disebut AutoT4) yang membuat bagian kompilasi T4 dari setiap build. Saya belum menghadapi solusi untuk ini selama penyebaran produksi, tetapi saya mengharapkan sesuatu yang serupa untuk memperbaikinya.
sumber
Saya hanya pemula C # jadi mungkin jawaban saya terdengar konyol - Saya menampilkan tanggal pembuatan dari tanggal file yang dapat dieksekusi terakhir ditulis ke:
Saya mencoba menggunakan metode File.GetCreationTime tetapi mendapat hasil aneh: tanggal dari perintah adalah 2012-05-29, tetapi tanggal dari Window Explorer menunjukkan 2012-05-23. Setelah mencari perbedaan ini, saya menemukan bahwa file itu mungkin dibuat pada 2012-05-23 (seperti yang ditunjukkan oleh Windows Explorer), tetapi disalin ke folder saat ini pada 2012-05-29 (seperti yang ditunjukkan oleh perintah File.GetCreationTime) - jadi untuk berada di sisi aman saya menggunakan perintah File.GetLastWriteTime.
Zalek
sumber
LastWriteTime
, karena itu secara akurat mencerminkan waktu ketika file yang dapat dieksekusi benar-benar diperbarui.Banyak jawaban bagus di sini tapi saya merasa saya bisa menambahkan sendiri karena kesederhanaan, kinerja (membandingkan dengan solusi terkait sumber daya) lintas platform (bekerja dengan Net Core juga) dan menghindari alat pihak ke-3. Cukup tambahkan target msbuild ini ke csproj.
dan sekarang Anda miliki
Builtin.CompileTime
ataunew DateTime(Builtin.CompileTime, DateTimeKind.Utc)
jika Anda membutuhkannya.ReSharper tidak akan menyukainya. Anda dapat mengabaikannya atau menambahkan kelas parsial ke proyek juga, tetapi tetap berhasil.
sumber
Builtin.CompileTime
dari tampilan Razor.BeforeTargets="RazorCoreCompile"
tetapi hanya sementara ini dalam proyek yang samaUntuk proyek .NET Core, saya mengadaptasi jawaban Postlagerkarte untuk memperbarui bidang Hak Cipta perakitan dengan tanggal pembuatan.
Edit csproj secara langsung
Berikut ini dapat ditambahkan langsung ke yang pertama
PropertyGroup
di csproj:Alternatif: Properti Proyek Visual Studio
Atau tempelkan ekspresi bagian dalam langsung ke bidang Hak Cipta di bagian Paket properti proyek di Visual Studio:
Ini bisa sedikit membingungkan, karena Visual Studio akan mengevaluasi ekspresi dan menampilkan nilai saat ini di jendela, tetapi juga akan memperbarui file proyek dengan tepat di belakang layar.
Solusi-lebar melalui Directory.Build.props
Anda dapat memasukkan
<Copyright>
elemen di atas ke dalamDirectory.Build.props
file di root solusi Anda, dan menerapkannya secara otomatis ke semua proyek dalam direktori, dengan asumsi setiap proyek tidak memberikan nilai Hak Cipta sendiri.Directory.Build.props: Sesuaikan bangunan Anda
Keluaran
Contoh ekspresi akan memberi Anda hak cipta seperti ini:
Pengambilan
Anda dapat melihat informasi hak cipta dari properti file di Windows, atau ambil saat runtime:
sumber
Metode di atas dapat di-tweak untuk rakitan yang sudah dimuat dalam proses dengan menggunakan gambar file dalam memori (bukan membaca ulang dari penyimpanan):
sumber
Bagi siapa pun yang perlu mendapatkan waktu kompilasi di Windows 8 / Windows Phone 8:
Bagi siapa pun yang perlu mendapatkan waktu kompilasi di Windows Phone 7:
CATATAN: Dalam semua kasus Anda berjalan di kotak pasir, sehingga Anda hanya akan bisa mendapatkan waktu kompilasi rakitan yang Anda gunakan dengan aplikasi Anda. (yaitu ini tidak akan bekerja pada apa pun di GAC).
sumber
var assembly = typeof (AnyTypeInYourAssembly).GetTypeInfo().Assembly;
Pada 2018 beberapa solusi di atas tidak berfungsi lagi atau tidak bekerja dengan .NET Core.
Saya menggunakan pendekatan berikut yang sederhana dan berfungsi untuk proyek .NET Core 2.0 saya.
Tambahkan berikut ini ke .csproj Anda di dalam PropertyGroup:
Ini mendefinisikan PropertyFunction yang bisa Anda akses di perintah pre build Anda.
Pra-bangun Anda terlihat seperti ini
Setel properti BuildTimeStamp.txt ke sumber daya Tertanam.
Sekarang Anda dapat membaca cap waktu seperti ini
sumber
"$(ProjectDir)BuildTimeStamp.txt"
) atau itu akan pecah ketika ada spasi di nama folder.$([System.DateTime]::Now.tostring("MM/dd/yyyy HH:mm:ss"))
bukan$([System.DateTime]::Now)
Opsi yang tidak dibahas di sini adalah untuk memasukkan data Anda sendiri ke AssemblyInfo.cs, bidang "AssemblyInformationalVersion" tampaknya tepat - kami memiliki beberapa proyek di mana kami melakukan sesuatu yang mirip dengan langkah pembangunan (namun saya tidak sepenuhnya senang dengan cara yang berhasil jadi tidak benar-benar ingin mereproduksi apa yang kita punya).
Ada artikel tentang subjek di codeproject: http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx
sumber
Saya membutuhkan solusi universal yang bekerja dengan proyek NETStandard di platform apa pun (iOS, Android, dan Windows.) Untuk mencapai ini, saya memutuskan untuk secara otomatis menghasilkan file CS melalui skrip PowerShell. Berikut ini skrip PowerShell:
Simpan file PowerScript sebagai GenBuildDate.ps1 dan tambahkan proyek Anda. Terakhir, tambahkan baris berikut ke acara Pra-Bangun Anda:
Pastikan BuildDate.cs termasuk dalam proyek Anda. Bekerja seperti juara di OS apa pun!
sumber
Saya hanya melakukan:
sumber
Anda dapat menggunakan proyek ini: https://github.com/dwcullop/BuildInfo
Ini memanfaatkan T4 untuk mengotomatiskan timestamp tanggal pembuatan. Ada beberapa versi (cabang berbeda) termasuk satu yang memberi Anda Git Hash dari cabang yang sedang diperiksa, jika Anda menyukai hal-hal semacam itu.
Pengungkapan: Saya menulis modul.
sumber
Pendekatan lain yang ramah PCL adalah menggunakan tugas inline MSBuild untuk mengganti waktu pembuatan menjadi string yang dikembalikan oleh properti di aplikasi. Kami menggunakan pendekatan ini dengan sukses di aplikasi yang memiliki proyek Xamarin.Forms, Xamarin.Android, dan Xamarin.iOS.
EDIT:
Disederhanakan dengan memindahkan semua logika ke dalam
SetBuildDate.targets
file, dan menggunakanRegex
alih-alih mengganti string sederhana sehingga file dapat dimodifikasi oleh setiap build tanpa "reset".Definisi tugas inline MSBuild (disimpan dalam file SetBuildDate.targets lokal untuk proyek Xamarin.Forms untuk contoh ini):
Menjalankan tugas inline di atas dalam file camarx Xamarin.Forms di target BeforeBuild:
The
FilePath
properti diatur keBuildMetadata.cs
file dalam proyek Xamarin.Forms yang berisi kelas sederhana dengan properti stringBuildDate
, di mana waktu membangun akan diganti:Tambahkan file ini
BuildMetadata.cs
ke proyek. Ini akan dimodifikasi oleh setiap build, tetapi dengan cara yang memungkinkan build berulang (replacements berulang), jadi Anda dapat memasukkan atau menghilangkannya dalam kontrol sumber seperti yang diinginkan.sumber
Anda bisa menggunakan acara post-build proyek untuk menulis file teks ke direktori target Anda dengan datetime saat ini. Anda kemudian bisa membaca nilainya pada saat run-time. Agak aneh, tetapi harus berhasil.
sumber
Saya tidak yakin, tapi mungkin Build Incrementer membantu.
sumber
Pembaruan kecil pada jawaban "Cara Baru" dari Jhon.
Anda perlu membangun jalur alih-alih menggunakan string CodeBase saat bekerja dengan ASP.NET/MVC
sumber
Anda bisa meluncurkan langkah ekstra dalam proses pembuatan yang menulis cap tanggal ke file yang kemudian dapat ditampilkan.
Pada tab properti projek lihat pada tab build event. Ada opsi untuk menjalankan perintah build pre atau post.
sumber
Saya menggunakan saran Gus Dur. Namun, sepertinya memberikan format waktu yang aneh dan juga menambahkan singkatan untuk hari itu sebagai bagian dari tanggal pembuatan; contoh: Minggu 12/24/2017 13: 21: 05.43. Saya hanya perlu tanggal saja jadi saya harus menghilangkan sisanya menggunakan substring.
Setelah menambahkan
echo %date% %time% > "$(ProjectDir)\Resources\BuildDate.txt"
ke acara pra-bangun, saya hanya melakukan hal berikut:Kabar baiknya di sini adalah bahwa itu berhasil.
sumber
Jika ini adalah aplikasi windows, Anda bisa menggunakan jalur eksekusi aplikasi: new System.IO.FileInfo (Application.ExecutablePath) .LastWriteTime.ToString ("yyyy.MM.dd")
sumber
bisa jadi
Assembly execAssembly = Assembly.GetExecutingAssembly(); var creationTime = new FileInfo(execAssembly.Location).CreationTime; // "2019-09-08T14:29:12.2286642-04:00"
sumber