ฉันพยายามรับรุ่นแอสเซมบลีที่กำลังดำเนินการใน C # 3.0 โดยใช้รหัสต่อไปนี้:
var assemblyFullName = Assembly.GetExecutingAssembly().FullName;
var version = assemblyFullName .Split(',')[1].Split('=')[1];
มีวิธีอื่นที่เหมาะสมในการทำเช่นนั้นหรือไม่?
ฉันพยายามรับรุ่นแอสเซมบลีที่กำลังดำเนินการใน C # 3.0 โดยใช้รหัสต่อไปนี้:
var assemblyFullName = Assembly.GetExecutingAssembly().FullName;
var version = assemblyFullName .Split(',')[1].Split('=')[1];
มีวิธีอื่นที่เหมาะสมในการทำเช่นนั้นหรือไม่?
คำตอบ:
สองตัวเลือก ... โดยไม่คำนึงถึงประเภทแอปพลิเคชันคุณสามารถเรียกใช้:
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
ในรหัสของฉันได้อย่างสมบูรณ์
ClickOnce
รุ่นที่ระบุโดย @Justin จะมีการระบุไว้ในPublish
แท็บภายในคุณสมบัติโครงการ (เช่นไม่เกี่ยวข้องกับ AssemblyVersion หรือ AssemblyFileVersion)
HomeController
ดังนั้นในมีดโกน:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
ใน 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" ของผู้ช่วย แต่ถ้าคุณรู้ว่ามีแอสเซมบลีการดำเนินการอย่างน้อยหนึ่งประเภทคุณไม่จำเป็นต้องสร้างคลาสตัวช่วยและช่วยประหยัดเวลาของคุณ
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
เนื่องจากจุดเข้าใช้งานสำหรับกระบวนการเป็นรหัสที่ไม่มีการจัดการมากกว่าแอสเซมบลีที่จัดการ
GetEntryAssembly
(vs GetCallingAssembly
หรือGetExecutingAssembly
) ดูเหมือนจะเป็นสิ่งเดียวที่ทำงานเมื่อถูกเรียกจากภายในไลบรารีอ้างอิง
สิ่งนี้ควรทำ:
Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName aName = assem.GetName();
return aName.Version.ToString();
ในที่สุดฉันก็ตัดสินใจ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
Product Version
อาจเป็นที่ต้องการหากคุณใช้การกำหนดเวอร์ชันผ่าน GitVersion หรือซอฟต์แวร์การกำหนดเวอร์ชันอื่น ๆ
ในการรับสิ่งนี้จากภายในห้องสมุดของคุณคุณสามารถโทรSystem.Diagnostics.FileVersionInfo.ProductVersion
:
using System.Diagnostics;
using System.Reflection;
//...
var assemblyLocation = Assembly.GetExecutingAssembly().Location;
var productVersion = FileVersionInfo.GetVersionInfo(assemblyLocation).ProductVersion
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion