Bagaimana saya bisa mendapatkan versi perakitan yang mengeksekusi?

169

Saya mencoba untuk mendapatkan versi perakitan yang dieksekusi di C # 3.0 menggunakan kode berikut:

var assemblyFullName = Assembly.GetExecutingAssembly().FullName;
var version = assemblyFullName .Split(',')[1].Split('=')[1];

Apakah ada cara lain yang tepat untuk melakukannya?

pengguna1
sumber

Jawaban:

293

Dua opsi ... apa pun jenis aplikasinya, Anda selalu dapat meminta:

Assembly.GetExecutingAssembly().GetName().Version

Jika aplikasi Windows Forms , Anda selalu dapat mengakses melalui aplikasi jika mencari versi produk khusus.

Application.ProductVersion

Menggunakan GetExecutingAssemblyreferensi rakitan tidak selalu merupakan pilihan. Karena itu, saya pribadi merasa berguna untuk membuat kelas pembantu statis di proyek-proyek di mana saya mungkin perlu merujuk ke versi perakitan atau perakitan yang mendasarinya:

// A sample assembly reference class that would exist in the `Core` project.
public static class CoreAssembly
{
    public static readonly Assembly Reference = typeof(CoreAssembly).Assembly;
    public static readonly Version Version = Reference.GetName().Version;
}

Maka saya bisa dengan bersih referensi CoreAssembly.Versiondalam kode saya sesuai kebutuhan.

Chris Baxter
sumber
7
Jika itu digunakan dengan ClickOnce, Anda perlu memeriksaSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
Justin Morgan
Apa yang akan menarik: Di mana Anda perlu menentukan versi yang sebenarnya? Saya menetapkan AssemblyVersion dan AssemblyFileVersion di AssemblyInfo.cs saya dan semua yang saya dapatkan dari panggilan di atas adalah: 0.0.0.0 walaupun telah ditentukan 1.0.0
AgentKnopf
@Zainodis Jika Anda merujuk ke ClickOnceversi yang disebutkan oleh @Justin, itu ditentukan pada Publishtab di dalam properti proyek (yaitu, tidak terkait dengan AssemblyVersion atau AssemblyFileVersion).
Chris Baxter
@CalgaryCoder terima kasih atas tanggapannya, saya tidak tahu apa itu ClickOnce, tetapi ternyata ketika mengedit file AssemblyInfo via VS maka tiba-tiba berfungsi oO. Mengedit AssemblyInfo.cas secara manual dalam editor teks membuat semua bidang kosong. Either way, itu diselesaikan sekarang :)
AgentKnopf
7
Perlu disebutkan bahwa ini tidak berfungsi di aplikasi ASP.NET MVC, karena konteks peluncuran. Solusinya adalah dengan merujuk Tipe yang dikenal dalam perakitan situs web Anda, misalnya MVC di mana-mana HomeController, jadi dalam Razor:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
James McCormack
38

Di MSDN, Assembly.GetExecutingAssembly Method , adalah komentar tentang metode "getexecutingassembly", bahwa untuk alasan kinerja, Anda harus memanggil metode ini hanya ketika Anda tidak tahu pada waktu desain apa yang sedang dieksekusi perakitan saat ini.

Cara yang disarankan untuk mengambil objek Majelis yang mewakili perakitan saat ini adalah dengan menggunakan Type.Assemblyproperti tipe yang ditemukan dalam perakitan.

Contoh berikut menggambarkan:

using System;
using System.Reflection;

public class Example
{
    public static void Main()
    {
        Console.WriteLine("The version of the currently executing assembly is: {0}",
                          typeof(Example).Assembly.GetName().Version);
    }
}

/* This example produces output similar to the following:
   The version of the currently executing assembly is: 1.1.0.0

Tentu saja ini sangat mirip dengan jawaban dengan kelas helper "public static class CoreAssembly", tetapi, jika Anda tahu setidaknya satu jenis rakitan pelaksana, tidak wajib membuat kelas helper, dan menghemat waktu Anda.

Sharunas Bielskis
sumber
19
using System.Reflection;
{
    string version = Assembly.GetEntryAssembly().GetName().Version.ToString();
}

Keterangan dari MSDN http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly%28v=vs.110%29.aspx :

The GetEntryAssemblyMetode dapat kembali nullketika berhasil perakitan telah dimuat dari aplikasi unmanaged. Misalnya, jika aplikasi yang tidak dikelola membuat turunan dari komponen COM yang ditulis dalam C #, panggilan ke GetEntryAssemblymetode dari komponen C # kembali null, karena titik masuk untuk proses adalah kode yang tidak dikelola daripada rakitan yang dikelola.

Hammad Qureshi
sumber
2
+1. GetEntryAssembly(vs GetCallingAssemblyatau GetExecutingAssembly) tampaknya menjadi satu-satunya hal yang berfungsi saat dipanggil dari dalam pustaka referensi.
drzaus
6

Ini harus dilakukan:

Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName aName = assem.GetName();
return aName.Version.ToString();
Elroy Flynn
sumber
5
3 baris ini bisa menjadi 1: mengembalikan Assembly.GetExecutingAssembly (). GetName (). Version.ToString (); .............
Alexandre
1

Product Version mungkin lebih disukai jika Anda menggunakan versi melalui GitVersion atau perangkat lunak versi lain.

Untuk mendapatkan ini dari dalam perpustakaan kelas Anda, Anda dapat menelepon System.Diagnostics.FileVersionInfo.ProductVersion:

using System.Diagnostics;
using System.Reflection;

//...

var assemblyLocation = Assembly.GetExecutingAssembly().Location;
var productVersion = FileVersionInfo.GetVersionInfo(assemblyLocation).ProductVersion

masukkan deskripsi gambar di sini

Daniel
sumber