मैं असेंबली फ़ाइल संस्करण कैसे प्राप्त कर सकता हूं


727

में AssemblyInfoदो विधानसभा संस्करण हैं:

  1. AssemblyVersion: असेंबली के संस्करण को जिम्मेदार ठहराया जा रहा है।
  2. AssemblyFileVersion: Win32 फ़ाइल संस्करण संसाधन के लिए एक विशिष्ट संस्करण संख्या का उपयोग करने के लिए एक संकलक को निर्देश देता है। Win32 फ़ाइल संस्करण को असेंबली के संस्करण संख्या के समान होने की आवश्यकता नहीं है।

मैं Assembly Versionनिम्नलिखित लाइन कोड के साथ प्राप्त कर सकता हूं :

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

लेकिन मैं कैसे प्राप्त कर सकता हूं Assembly File Version?


2
"असेंबली फ़ाइल संस्करण" से आपका क्या मतलब है "असेंबली संस्करण" के विपरीत? क्या आप एक उदाहरण दे सकते हैं?
Xiaofu

7
@Xiaofu - "असेंबली वर्जन" वह है जो .NET आंतरिक रूप से उपयोग करता है। "असेंबली फ़ाइल संस्करण" वह है जो तब दिखाता है जब आप किसी फ़ाइल पर राइट-क्लिक करते हैं और "गुण" तब "विवरण" टैब पर जाते हैं। वे एक जैसे नहीं हैं।
rory.ap

मैंने पाया है कि AppData में user.config स्थान का निर्धारण करते समय असेंबली संस्करण का उपयोग किया जाता है।
काइल डेलानी

जवाबों:


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: इसके बजाय किसी असेंबलीInfo.cs फ़ाइल से संस्करण संख्या प्राप्त करने का कोई तरीका है?
मार्कस

56
इस कोड के साथ एक समस्या यह है कि, यह वास्तव में 1.0 लौटाएगा। यदि आपने बिल्ड और संशोधन संख्या निर्दिष्ट नहीं की है। AssemblyName.GetAssemblyName (assembly.Location) .Version.ToString (); आपको 'संकलित' संस्करण संख्या मिल जाएगी - जो फाइलवर्सन के समान होनी चाहिए, यदि आप दोनों संस्करणों को एक ही तरह सेट कर रहे हैं।
डोगुहान उलुका

17
@DoguhanUluca वे दो अलग-अलग चीजें हैं। वह आपको असेंबली संस्करण देगा, न कि फ़ाइल संस्करण। "यदि आप दोनों संस्करणों को एक ही तरह सेट कर रहे हैं" एक समाधान है, न कि समाधान।
Nyerguds

1
क्या FileVersionInfoकेवल stringगुण हैं और कोई Versionगुण नहीं है?
काइल डेलानी

3
@ वाय्ज़चेक: Assembly.GetEntryAssembly()ऑफिस ऐड-इन्स के संदर्भ में, और कई अन्य मामलों में भी NULL लौटाता है। इसके अलावा, अगर आप एडिंस / प्लगइन्स के बारे में सोचते हैं - EntryAssembly होस्ट एप्लिकेशन है, और सबसे अधिक बार आप YourCode (TM) का संस्करण चाहते हैं :) इसके अलावा, यह इस जवाब को जोड़ने के लायक है कि उत्तर में assembly.Locationउपयोग किया जा सकता है। (यानी पहला बेतरतीब मामला सामने आया: github.com/Azure/azure-functions-host/issues/1233 ) और यह संभवत : अशक्त प्रवेश-सभा की तुलना में अधिक बार भी होता है।
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
और [assembly: AssemblyVersion("2.0.*")]असेंबलीइन्फो में इनको निर्दिष्ट करना चाहते हैं। फाइल के लिए, असेंबली वर्जन उपयोग के लिए (जो भी संख्याएँ आप चाहते हैं) === फ़ाइलवर्जन उपयोग के लिए === [assembly: AssemblyFileVersion("2.0.*")]और प्रोडक्ट वर्जन उपयोग के लिए === [assembly: AssemblyInformationalVersion("2.0.*")] अंतिम SemVerसंगतता के लिए स्ट्रिंग प्रत्यय ले सकते हैं :[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
जेसी चिशोल्म 16

परिशिष्ट: प्रत्यय संकेतन का AssemblyFileVersionउपयोग नहीं कर सकते हैं *। :( इसे सभी चार नंबरों की आवश्यकता है।[assembly: AssemblyFileVersion("2.0.0.1")]
जेसी चिशोल्म

66

जब मैं एप्लिकेशन फ़ाइल संस्करण (असेंबली जानकारी में सेट किया गया -> फ़ाइल संस्करण) एक्सेस करना चाहता हूं, तो संस्करण प्रदर्शित करने के लिए फॉर्म लोड पर उस पर लेबल का टेक्स्ट सेट करने के लिए कहें, मैंने अभी उपयोग किया है

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

53
ध्यान दें कि इसके लिए System.Windows.Forms के संदर्भ की आवश्यकता होती है, और इसलिए यह सभी अनुप्रयोगों के लिए उपयुक्त नहीं हो सकता है।
ब्राडलीडॉटनेट

2
दुर्भाग्य से, यह एक स्ट्रिंग है। आदर्श नहीं है यदि आप इसे और अधिक सरल "v1.08" प्रारूप के प्रारूप में रखना चाहते हैं। यदि आप वास्तव में पूर्णांक के रूप में उप-घटकों को प्राप्त करने के लिए संस्करण ऑब्जेक्ट प्राप्त करते हैं तो बहुत अधिक हैंडियर।
Nyerguds

1
इसके अलावा, यह
असेंबलीइन्फो

क्या कोई उच्च प्रतिनिधि उपयोगकर्ता इस उत्तर को संपादित कर सकता है ताकि यह स्पष्ट हो सके कि यह केवल विंडोज फॉर्म के लिए है?
jrh

यह वही है जो मैं देख रहा था, उत्तर के लिए धन्यवाद!
डेविड रिफौआ

23

अद्यतन: जैसा कि मेरे उद्धृत पोस्ट में रिचर्ड ग्रिम्स ने उल्लेख किया है , @ आई और @ डमित्री लोबानोव, मेरा उत्तर सिद्धांत में सही है लेकिन व्यवहार में गलत है।

जैसा कि मुझे अनगिनत पुस्तकों आदि से याद किया जाना चाहिए, जबकि कोई इन गुणों का उपयोग करके सेट करता है [assembly: XXXAttribute], वे संकलक द्वारा उच्चीकृत हो जाते हैं और VERSIONINFOसंसाधन में रखे जाते हैं ।

उपरोक्त कारण के लिए, आपको @ Xiaofu के उत्तर में दृष्टिकोण का उपयोग करने की आवश्यकता है क्योंकि सिग्नल को उनके द्वारा निकाले जाने के बाद विशेषताएँ छीन ली गई हैं।


सार्वजनिक स्थैतिक स्ट्रिंग GetProductVersion ()
{
  var विशेषता = (असेम्बली विचलनअध्याय) विधानसभा
    .GetExecutingAssembly ()
    .GetCustomAttributes (टाइपोफ़ेक्ट (असेंबली वर्जन एट्रिब्यूट), सच)
    ।एक();
   वापसी का गुण।
}

( Http://bytes.com/groups/net/420417-assemblyversionattribute से - जैसा कि वहाँ उल्लेख किया गया है, यदि आप एक अलग विशेषता की तलाश कर रहे हैं, तो उपरोक्त में स्थानापन्न करें)


हे रूबेन, 2 नोट। सबसे पहले, विधानसभा विधानसभा के लिए पूछे जाने वाले प्रश्न दूसरा, असेम्बली.गेट एक्सिटिंगसंगच ()
इयान

पहले बिंदु पर, यही कारण है कि मैंने कहा "यदि आप एक अलग विशेषता के लिए देख रहे हैं, तो उपरोक्त में विकल्प दें" (IIRC I did not try it out)। दूसरा, जो प्रशंसनीय लगता है, लेकिन उसमें खोदने का समय नहीं है ...
Ruben बार्टेलिंक

हाँ, आप वास्तव में .VetCustomAttribute () के माध्यम से असेंबली विचलन विशेषता प्राप्त नहीं कर सकते, असेंबली संस्करण AssemblyName.Versionकेवल संपत्ति के माध्यम से प्राप्त किया जा सकता है । लेकिन हर दूसरी विशेषता के साथ यह करने का सही तरीका है
दिमित्रि लोबानोव

@DmitryLobanov और आईएएन धन्यवाद संकेतों के लिए। मुझे उम्मीद है कि संपादन इसे हटाने के बजाय जवाब देने लायक बनाने के लिए पर्याप्त रूप से कवर करता है - मुझे बताएं!
रूबेन बार्टलिंक

1
मैं .net कोर 3.1 के AssemblyInformationalVersionAttributeबजाय इस्तेमाल कियाAssemblyVersionAttribute
Vasya Milovidov

5

इसे इस्तेमाल करो:

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

या यह:

new Version(System.Windows.Forms.Application.ProductVersion);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.