ฉันจะรับเวอร์ชันไฟล์ประกอบได้อย่างไร


727

ในAssemblyInfoมีสองรุ่นประกอบ:

  1. AssemblyVersion: ระบุรุ่นของแอสเซมบลีที่เกิดขึ้น
  2. AssemblyFileVersion: สั่งให้คอมไพเลอร์ใช้หมายเลขรุ่นเฉพาะสำหรับทรัพยากรเวอร์ชั่นของไฟล์ Win32 รุ่นของไฟล์ Win32 ไม่จำเป็นต้องเหมือนกับหมายเลขเวอร์ชั่นของชุดประกอบ

ฉันจะได้รับAssembly Versionกับบรรทัดของรหัสต่อไปนี้:

Version version = Assembly.GetEntryAssembly().GetName().Version;

แต่ฉันจะหาได้Assembly File Versionอย่างไร


2
คุณหมายถึงอะไร "แอสเซมบลีไฟล์เวอร์ชัน" ซึ่งตรงข้ามกับ "แอสเซมบลีเวอร์ชัน" คุณยกตัวอย่างได้ไหม
Xiaofu

7
@Xiaofu - "Assembly Version" คือสิ่งที่. NET ใช้ภายใน "Assembly File Version" เป็นสิ่งที่แสดงเมื่อคุณคลิกขวาที่ไฟล์และไปที่ "properties" จากนั้นคลิกที่แท็บ "details" พวกเขาไม่เหมือนกัน
rory.ap

ฉันพบว่าเวอร์ชันแอสเซมบลีเป็นสิ่งที่ใช้เมื่อกำหนดตำแหน่ง user.config ใน AppData
Kyle Delaney

คำตอบ:


867

ดูความคิดเห็นของฉันด้านบนขอชี้แจงในสิ่งที่คุณต้องการ หวังว่านี่คือ:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;

4
@Xiaofu: มีวิธีใดที่จะได้รับหมายเลขรุ่นจากไฟล์ AssemblyInfo.cs แทนหรือไม่?
Markus

56
ปัญหาอย่างหนึ่งของรหัสนี้ก็คือมันจะส่งคืนจริง ๆ 1.0. *. * ถ้าคุณยังไม่ได้ระบุหมายเลข Build และ Revision AssemblyName.GetAssemblyName (assembly.Location) .Version.ToString (); จะทำให้คุณได้รับหมายเลขเวอร์ชัน 'รวบรวม' - ซึ่งควรเป็นเช่นเดียวกับ FileVersion หากคุณกำลังตั้งค่าทั้งสองรุ่นด้วยวิธีเดียวกัน
Doguhan Uluca

17
@DoguhanUluca พวกเขามีสองสิ่งที่แตกต่างกัน นั่นจะให้เวอร์ชั่นประกอบไม่ใช่เวอร์ชั่นไฟล์ "หากคุณกำลังตั้งค่าทั้งสองเวอร์ชันด้วยวิธีเดียวกัน" เป็นวิธีแก้ปัญหาไม่ใช่วิธีแก้ปัญหา
Nyerguds

1
ไม่FileVersionInfoเพียง แต่มีstringคุณสมบัติและไม่มีVersionคุณสมบัติ?
Kyle Delaney

3
@Yitzchak: Assembly.GetEntryAssembly()ส่งคืน NULL ตัวอย่างเช่นในบริบทของ Office Add-in และในกรณีอื่น ๆ อีกมากมาย นอกจากนี้ถ้าคุณคิดเกี่ยวกับ addins / plugins - EntryAssembly เป็นแอปพลิเคชันโฮสต์และบ่อยครั้งที่คุณต้องการรุ่น YourCode (TM) :) นอกเหนือจากนั้นมันก็คุ้มค่าที่จะเพิ่มคำตอบนี้ที่assembly.Locationใช้ในคำตอบนี้เป็นโมฆะเช่นกัน (เช่นกรณีสุ่มครั้งแรก googled out: github.com/Azure/azure-functions-host/issues/1233 ) และอาจเกิดขึ้นบ่อยกว่าการมี null entry-assembly
quetzalcoatl

209

มีสามรุ่น : ชุมนุม , แฟ้มและผลิตภัณฑ์ คุณลักษณะเหล่านี้ถูกใช้งานและใช้ค่าเริ่มต้นที่แตกต่างกันหากคุณไม่ได้ระบุอย่างชัดเจน

string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
string assemblyVersion = Assembly.LoadFile("your assembly file").GetName().Version.ToString(); 
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; 
string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;

17
สำหรับเมื่อโพสต์บล็อกนั้นหายไปสักวันที่นี่จะถูกต้มเพื่อการอ้างอิง:string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString(); string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
JMD

3
และสำหรับผู้ที่ต้องการระบุสิ่งเหล่านี้ในไฟล์ AssemblyInfo.cs สำหรับการใช้งาน assemblyVersion (ด้วยหมายเลขใดก็ตามที่คุณต้องการ) === [assembly: AssemblyVersion("2.0.*")]สำหรับการใช้ fileVersion === [assembly: AssemblyFileVersion("2.0.*")]และสำหรับการใช้ productVersion === [assembly: AssemblyInformationalVersion("2.0.*")] สุดท้ายอาจใช้คำต่อท้ายสตริงเพื่อSemVerความเข้ากันได้:[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Jesse Chisholm

ภาคผนวก: AssemblyFileVersionอาจไม่ใช้รูปแบบ*คำต่อท้าย :( มันต้องการตัวเลขทั้งสี่ตัว[assembly: AssemblyFileVersion("2.0.0.1")]
Jesse Chisholm

66

เมื่อฉันต้องการเข้าถึงเวอร์ชันไฟล์แอปพลิเคชัน (สิ่งที่ตั้งค่าในแอสเซมบลีข้อมูล -> เวอร์ชันไฟล์) ให้ตั้งค่าข้อความของป้ายกำกับบนโหลดแบบฟอร์มเพื่อแสดงเวอร์ชันฉันเพิ่งใช้

versionlabel.Text = "Version " + Application.ProductVersion;

53
โปรดทราบว่าสิ่งนี้ต้องการการอ้างอิงถึง System.Windows.Forms และอื่น ๆ อาจไม่เหมาะสำหรับแอปพลิเคชันทั้งหมด
BradleyDotNET

2
น่าเสียดายที่สตริงนั้น ไม่เหมาะถ้าคุณต้องการจัดรูปแบบด้วยตัวคุณเองเป็นรูปแบบ "v1.08" แบบง่าย ๆ มีประโยชน์มากขึ้นถ้าคุณได้รับออบเจ็กต์เวอร์ชันเพื่อรับส่วนประกอบย่อยเป็นจำนวนเต็ม
Nyerguds

1
นอกจากนี้ยังเลือก AssemblyFileVersion จาก AssemblyInfo ไม่ใช่ AssemblyVersion ดังนั้นระวัง
dario_ramos

ผู้ใช้ตัวแทนระดับสูงสามารถแก้ไขคำตอบนี้เพื่อให้ชัดเจนยิ่งขึ้นว่าเป็นแบบฟอร์ม Windows เท่านั้นหรือไม่
jrh

นี่คือสิ่งที่ฉันกำลังมองหาขอบคุณสำหรับคำตอบ!
David Refoua

23

UPDATE: ตามที่ Richard Grimes พูดถึงในบทความที่ฉันอ้างถึง @Iain และ @Dmitry Lobanov คำตอบของฉันถูกต้องในทางทฤษฎี แต่ผิดในทางปฏิบัติ

อย่างที่ฉันควรจะจำได้จากหนังสือที่นับไม่ถ้วน ฯลฯ ในขณะที่ชุดหนึ่งใช้คุณสมบัติเหล่านี้[assembly: XXXAttribute]พวกเขาจะได้รับคอมไพเลอร์สูงโดยวางไว้ในVERSIONINFOทรัพยากร

ด้วยเหตุผลข้างต้นคุณต้องใช้วิธีการในคำตอบของ @ Xiaofuเนื่องจากคุณลักษณะจะถูกปล้นหลังจากแยกสัญญาณออกแล้ว


ประชาชนคงสตริง GetProductVersion ()
{
  var attribute = (AssemblyVersionAttribute) ชุดประกอบ
    .GetExecutingAssembly ()
    .GetCustomAttributes (typeof (AssemblyVersionAttribute) จริง)
    .Single ();
   return attribute.InformationalVersion;
}

(จากhttp://bytes.com/groups/net/420417-assemblyversionattribute - ตามที่ระบุไว้ที่นั่นหากคุณกำลังมองหาแอททริบิวต์ที่แตกต่างออกไป


เฮ้รูเบน 2 โน้ต ก่อนคำถามที่ถามสำหรับ AssemblyFileVersion ไม่ใช่ AssemblyVersion ประการที่สอง Assembly.GetExecutingAssembly (). GetCustomAttributes (typeof (AssemblyVersionAttribute), true) ส่งคืนอาร์เรย์ที่มีความยาว 0 ฉันคิดว่านี่เป็นเพราะ AssemblyVersionAttribute ไม่ใช่แอตทริบิวต์ที่กำหนดเอง
Iain

ถึงจุดแรกนั่นคือเหตุผลที่ฉันพูดว่า "หากคุณกำลังมองหาคุณลักษณะที่แตกต่างให้แทนที่สิ่งนั้นลงในข้างต้น" (IIRC ฉันไม่ได้ลองเลย) เรื่องที่สองที่ดูเหมือนเป็นไปได้ แต่ไม่ได้มีเวลาที่จะขุดใน ...
Ruben Bartelink

ใช่จริง ๆ แล้วคุณไม่สามารถรับแอตทริบิวต์ AssemblyVersion ผ่านทาง. GetCustomAttribute () รุ่นแอสเซมบลีสามารถเรียกดูได้ผ่านAssemblyName.Versionคุณสมบัติเท่านั้น แต่ด้วยคุณสมบัติอื่น ๆ ทุกอย่างมันเป็นวิธีที่ถูกต้องที่จะทำ
Dmitrii Lobanov

@DmitryLobanov และ Iain ขอบคุณสำหรับคำแนะนำ ฉันหวังว่าการแก้ไขจะครอบคลุมอย่างเพียงพอที่จะทำให้คำตอบมีค่ามากกว่าการลบ - แจ้งให้เราทราบ
Ruben Bartelink

1
ฉันใช้AssemblyInformationalVersionAttributeแทนAssemblyVersionAttribute. net core 3.1
Vasya Milovidov

5

ใช้สิ่งนี้:

((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
    Assembly.GetExecutingAssembly(), 
    typeof(AssemblyFileVersionAttribute), false)
).Version;

หรือสิ่งนี้:

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