ฉันจะรับแอสเซมบลีเวอร์ชันการดำเนินการได้อย่างไร


169

ฉันพยายามรับรุ่นแอสเซมบลีที่กำลังดำเนินการใน C # 3.0 โดยใช้รหัสต่อไปนี้:

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

มีวิธีอื่นที่เหมาะสมในการทำเช่นนั้นหรือไม่?

คำตอบ:


293

สองตัวเลือก ... โดยไม่คำนึงถึงประเภทแอปพลิเคชันคุณสามารถเรียกใช้:

Assembly.GetExecutingAssembly().GetName().Version

หากแอปพลิเคชันWindows Formsคุณสามารถเข้าถึงผ่านแอปพลิเคชันได้ตลอดเวลาหากค้นหารุ่นผลิตภัณฑ์โดยเฉพาะ

Application.ProductVersion

การใช้GetExecutingAssemblyสำหรับการอ้างอิงแอสเซมบลีไม่ใช่ตัวเลือกเสมอ ดังนั้นฉันพบว่ามีประโยชน์ในการสร้างคลาสตัวช่วยคงที่ในโครงการที่ฉันอาจต้องอ้างอิงแอสเซมบลีพื้นฐานหรือเวอร์ชันแอสเซมบลี:

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

จากนั้นฉันสามารถอ้างอิงCoreAssembly.Versionในรหัสของฉันได้อย่างสมบูรณ์


7
ถ้ามันถูกปรับใช้กับ ClickOnce คุณต้องตรวจสอบSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
Justin Morgan

สิ่งที่น่าสนใจ: คุณต้องระบุเวอร์ชันจริงที่ไหน ฉันระบุ AssemblyVersion และ AssemblyFileVersion ใน AssemblyInfo.cs ของฉันและสิ่งที่ฉันได้รับจากการเรียกใช้วิธีข้างต้นคือ: 0.0.0.0 แม้จะมีการระบุ 1.0.0
AgentKnopf

@Zainodis หากคุณอ้างถึงClickOnceรุ่นที่ระบุโดย @Justin จะมีการระบุไว้ในPublishแท็บภายในคุณสมบัติโครงการ (เช่นไม่เกี่ยวข้องกับ AssemblyVersion หรือ AssemblyFileVersion)
Chris Baxter

@CalgaryCoder ขอบคุณสำหรับการตอบสนองฉันไม่ทราบว่า ClickOnce คืออะไร แต่ปรากฏเมื่อแก้ไขไฟล์ AssemblyInfo ผ่าน VS จากนั้นก็ใช้งานได้ทันที oO การแก้ไข AssemblyInfo.cas ด้วยตนเองในเท็กซ์เอดิเตอร์ทำให้ฟิลด์ทั้งหมดกลายเป็นค่าว่าง ไม่ว่าจะด้วยวิธีใดก็สามารถแก้ไขได้แล้ว :)
AgentKnopf

7
เป็นมูลค่าการกล่าวขวัญว่านี้ไม่ได้ทำงานในแอป ASP.NET MVC เพราะบริบทการเปิดตัว วิธีแก้ปัญหาคือการอ้างอิงประเภทที่รู้จักในการประกอบเว็บไซต์ของคุณเช่น MVC ที่แพร่หลายHomeControllerดังนั้นในมีดโกน:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
James McCormack

38

ใน MSDN, Assembly.GetExecutingAssembly Methodเป็นคำพูดเกี่ยวกับวิธีการ "getexecutingassembly" ซึ่งสำหรับเหตุผลด้านประสิทธิภาพคุณควรเรียกวิธีนี้เฉพาะเมื่อคุณไม่ทราบว่าในขณะออกแบบสิ่งที่แอสเซมบลีกำลังดำเนินการอยู่

วิธีที่แนะนำในการดึงข้อมูลแอสเซมบลีวัตถุที่แสดงถึงแอสเซมบลีปัจจุบันคือการใช้Type.Assemblyคุณสมบัติของชนิดที่พบในแอสเซมบลี

ตัวอย่างต่อไปนี้แสดงให้เห็นถึง:

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

แน่นอนว่ามันคล้ายกับคำตอบของคลาสผู้ช่วย "public static class CoreAssembly" ของผู้ช่วย แต่ถ้าคุณรู้ว่ามีแอสเซมบลีการดำเนินการอย่างน้อยหนึ่งประเภทคุณไม่จำเป็นต้องสร้างคลาสตัวช่วยและช่วยประหยัดเวลาของคุณ


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

ข้อสังเกตจาก MSDN http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly%28v=vs.110%29.aspx :

GetEntryAssemblyวิธีการสามารถกลับมาnullเมื่อมีการจัดการชุมนุมได้รับการโหลดจากโปรแกรมประยุกต์ที่ไม่มีการจัดการ ตัวอย่างเช่นหากแอปพลิเคชันที่ไม่มีการจัดการสร้างอินสแตนซ์ของคอมโพเนนต์ COM ที่เขียนใน C # การเรียกใช้GetEntryAssemblyเมธอดจากคอมโพเนนต์ C # จะส่งคืนnullเนื่องจากจุดเข้าใช้งานสำหรับกระบวนการเป็นรหัสที่ไม่มีการจัดการมากกว่าแอสเซมบลีที่จัดการ


2
+1 GetEntryAssembly(vs GetCallingAssemblyหรือGetExecutingAssembly) ดูเหมือนจะเป็นสิ่งเดียวที่ทำงานเมื่อถูกเรียกจากภายในไลบรารีอ้างอิง
drzaus

6

สิ่งนี้ควรทำ:

Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName aName = assem.GetName();
return aName.Version.ToString();

5
3 บรรทัดนี้อาจกลายเป็น 1: return Assembly.GetExecutingAssembly (). GetName (). Version.ToString (); .............
Alexandre

1

ในที่สุดฉันก็ตัดสินใจtypeof(MyClass).GetTypeInfo().Assembly.GetName().Versionซื้อแอพ netstandard1.6 คำตอบที่เสนอทั้งหมดอื่น ๆ นำเสนอวิธีแก้ปัญหาบางส่วน นี่คือสิ่งเดียวที่ทำให้ฉันได้อย่างที่ฉันต้องการ

แหล่งที่มาจากการรวมกันของสถานที่:

https://msdn.microsoft.com/en-us/library/x4cw969y(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/2exyydhb(v=vs.110).aspx


1

Product Version อาจเป็นที่ต้องการหากคุณใช้การกำหนดเวอร์ชันผ่าน GitVersion หรือซอฟต์แวร์การกำหนดเวอร์ชันอื่น ๆ

ในการรับสิ่งนี้จากภายในห้องสมุดของคุณคุณสามารถโทรSystem.Diagnostics.FileVersionInfo.ProductVersion:

using System.Diagnostics;
using System.Reflection;

//...

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

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.