प्रोग्राम को DLL का वर्जन नंबर प्राप्त करें


151

क्या किसी .NET .NET DLL से प्रोग्राम क्रमांक प्राप्त करना संभव है?

यदि हाँ, तो कैसे?


10
विश्वास नहीं कर सकता कि यह 6 मिनट पहले पूछा गया था, बस वही पूछने वाला था!
शक्ति

2
इस लिंक को ऑटो इंक्रीमेंट वर्जन के लिए भी देखें - blog.mbcharbonneau.com/2007/03/13/…
JL

जवाबों:


119
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;

महत्वपूर्ण: यह ध्यान दिया जाना चाहिए कि यह मूल प्रश्न का सबसे अच्छा जवाब नहीं है। इस पृष्ठ पर और अधिक पढ़ने के लिए मत भूलना।


28
यह MyAssembly.dll को लोड करने वाले AppDomain ... बुरे विचार में लोड करता है।
staafl

12
मैं Assemblyname.GetAssemblyNameइन मुद्दों से बचने की सलाह देता हूँ
staafl

7
अपॉइंटमेंट में एक असेंबली लोड करना धीमा है, अपरिवर्तनीय (आप इसे डोमेन को मारे बिना लोड नहीं कर सकते हैं), अनुमति की आवश्यकता होती है और साइड इफेक्ट्स के कारण उत्तरदायी है, जैसे कि beforefieldinitटाइप इनिशियलाइज़र को निष्पादित करना, और इस मामले में बस आवश्यक नहीं है। क्या ये कारण पर्याप्त हैं?
staafl

7
@staafl: हाँ; न केवल मेरे लिए, बल्कि भविष्य में इस पृष्ठ को पढ़ने वाले अन्य सभी लोगों के लिए भी।
क्रिश

6
FileVersionInfo.GetVersionInfo("foo.dll").FileVersionअच्छी तरह से काम करता है और आवेदन में dll लोड नहीं करता है।
जैक

181

यह काम करता है अगर dll .net या Win32 है । प्रतिबिंब विधियाँ केवल तभी काम करती हैं जब dll .net हो। इसके अलावा, यदि आप प्रतिबिंब का उपयोग करते हैं, तो आपके पास पूरे डीएल को मेमोरी में लोड करने का ओवरहेड है। नीचे की विधि विधानसभा को मेमोरी में लोड नहीं करती है।

// Get the file version.
FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(@"C:\MyAssembly.dll");

// Print the file name and version number.
Console.WriteLine("File: " + myFileVersionInfo.FileDescription + '\n' +
                  "Version number: " + myFileVersionInfo.FileVersion);

प्रेषक: http://msdn.microsoft.com/en-us/library/system.diagnostics.fileversioninfo.fileversion.aspx

मूल स्रोत


5
यह मुझे पंसद है। आप dll को लोड करने से क्यों परेशान होंगे और फिर केवल संस्करण प्राप्त करने के लिए प्रतिबिंब का उपयोग करें, जब आप वास्तव में करना चाहते हैं तो यह है ???
aggieNick02

@ हे, क्या आप पोस्ट को संपादित कर सकते हैं? मैंने देखा कि मैंने एक नीचा जोड़ने से -1 प्रतिनिधि खो दिया था, जो मुझे याद नहीं है। जब तक आप इस पोस्ट को संपादित नहीं करते, यह मुझे बदलने नहीं देगा। चियर्स!
ल्यूक डुड्रिज 21'14

9
आप बनाने के लिए चाहते हैं, तो सुनिश्चित करें कि आप मिल निष्पादन योग्य / dll वास्तव में वर्तमान में उपयोग में: एक स्थिर फ़ाइल नाम (के बजाय @"C:\MyAssembly.dll"ऊपर), आप उपयोग कर सकते हैं System.Reflection.Assembly.GetExecutingAssembly().Location(या एक dll यदि: Assembly.GetAssembly(typeof(AClassInTheDll)).Location)
कॉनरोड

4
यह असेंबली विचलन और असेंबली फ़ाइलेविज़न विशेषताओं के बीच अंतर है। असेम्बलीफाइलवर्जन को इस तरह से स्टैंप किया जाता है जैसे कि विंडोज एपीआई को मूल्य मिल सकता है। असेंबली विचलन मजबूत नाम का एक हिस्सा है और जरूरी नहीं कि असेंबली फ़ाइलव्यूशन के समान हो।
दूघी

51

सबसे पहले, दो संभावित 'संस्करण' हैं जिन्हें आप में रुचि हो सकती है:

  • विंडोज फाइलसिस्टम फ़ाइल संस्करण, सभी निष्पादन योग्य फाइलों पर लागू होता है

  • असेंबली बिल्ड संस्करण, जो कंपाइलर द्वारा एक .NET असेंबली में एम्बेडेड है (जाहिर है कि केवल .NET असेंबली dll और exe फ़ाइलों पर लागू होता है)

पूर्व मामले में, आपको बेन एंडरसन के उत्तर का उपयोग करना चाहिए; यदि AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Versionआपके कोड द्वारा असेंबली को संदर्भित किया जाता है , तो बाद वाले मामले में, Tataro का जवाब , उपयोग या Tataro का जवाब।

ध्यान दें कि आप उन सभी उत्तरों को अनदेखा कर सकते हैं जो उपयोग .Load()/ .LoadFrom()तरीके करते हैं, क्योंकि ये वास्तव में असेंबली को वर्तमान AppDomain में लोड करते हैं - जो एक पेड़ को काटने के लिए अनुरूप है यह देखने के लिए कि यह कितना पुराना है।


32

यहाँ एक विशेष वर्ग वाले DLL का एक संस्करण प्राप्त करने के लिए थोड़ा सा प्रतिबिंब का उपयोग करने का एक अच्छा तरीका है:

var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version;

बस की जगह! कक्षा! उस वर्ग के नाम के साथ जिसे आप DLL में परिभाषित करते हैं, जिसका आप संस्करण प्राप्त करना चाहते हैं।

यह मेरी पसंदीदा विधि है क्योंकि अगर मैं अलग-अलग डिप्लॉय के लिए डीएलएल को इधर-उधर कर देता हूं तो मुझे फाइलपथ को बदलने की जरूरत नहीं है।


3
ध्यान दें कि यह केवल तभी काम करता है जब विचाराधीन विधानसभा को वर्तमान में संदर्भित किया जाता है।
स्टैफ्लड

2
यह सबसे अच्छा जवाब के बाद से DLL जरूरी प्रविष्टि विधानसभा नहीं भी विधानसभा इस से कहा जाता है नहीं है
सीएडी लड़का

1
विभिन्न प्रकार के संस्करण जानकारी प्राप्त करने के लिए stackoverflow.com/a/909583/492 देखें । जैसेFileVersionInfo
सीएडी

22

इसे विधानसभा के लिए शुरू करने के लिए (विनफॉर्म, कंसोल ऐप, आदि ...)

using System.Reflection;
...
Assembly.GetEntryAssembly().GetName().Version

6
GetExecutingAssembly () भी मदद कर सकता है।
बोल्ट थंडर

10

क्राइस, वास्तविक DLL फ़ाइल से असेंबली को लोड करने की आवश्यकता होने पर आपका संस्करण बहुत अच्छा काम करता है (और अगर DLL है तो!), हालाँकि, यदि DLL EMBEDDED है तो एक बहुत अवांछित त्रुटि प्राप्त होगी (अर्थात, एक फ़ाइल नहीं, बल्कि एक एम्बेडेड। DLL)।

दूसरी बात यह है, अगर कोई " 1.2012.0508.0101 " जैसी किसी चीज के साथ संस्करण योजना का उपयोग करता है , जब कोई संस्करण स्ट्रिंग प्राप्त करता है तो आपको वास्तव में " 1.2012.518.101 " मिलेगा ; लापता शून्य पर ध्यान दें

इसलिए, यहां DLL का संस्करण प्राप्त करने के लिए कुछ अतिरिक्त कार्य हैं (एम्बेडेड या DLL फ़ाइल से):

    public static System.Reflection.Assembly GetAssembly(string pAssemblyName)
    {
        System.Reflection.Assembly tMyAssembly = null;

        if (string.IsNullOrEmpty(pAssemblyName)) { return tMyAssembly; }
        tMyAssembly = GetAssemblyEmbedded(pAssemblyName);
        if (tMyAssembly == null) { GetAssemblyDLL(pAssemblyName); }

        return tMyAssembly;
    }//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)


    public static System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)
    {
        System.Reflection.Assembly tMyAssembly = null;

        if(string.IsNullOrEmpty(pAssemblyDisplayName)) { return tMyAssembly; }
        try //try #a
        {
            tMyAssembly = System.Reflection.Assembly.Load(pAssemblyDisplayName);
        }// try #a
        catch (Exception ex)
        {
            string m = ex.Message;
        }// try #a
        return tMyAssembly;
    }//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)


    public static System.Reflection.Assembly GetAssemblyDLL(string pAssemblyNameDLL)
    {
        System.Reflection.Assembly tMyAssembly = null;

        if (string.IsNullOrEmpty(pAssemblyNameDLL)) { return tMyAssembly; }
        try //try #a
        {
            if (!pAssemblyNameDLL.ToLower().EndsWith(".dll")) { pAssemblyNameDLL += ".dll"; }
            tMyAssembly = System.Reflection.Assembly.LoadFrom(pAssemblyNameDLL);
        }// try #a
        catch (Exception ex)
        {
            string m = ex.Message;
        }// try #a
        return tMyAssembly;
    }//System.Reflection.Assembly GetAssemblyFile(string pAssemblyNameDLL)


    public static string GetVersionStringFromAssembly(string pAssemblyDisplayName)
    {
        string tVersion = "Unknown";
        System.Reflection.Assembly tMyAssembly = null;

        tMyAssembly = GetAssembly(pAssemblyDisplayName);
        if (tMyAssembly == null) { return tVersion; }
        tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
        return tVersion;
    }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)


    public static string GetVersionString(Version pVersion)
    {
        string tVersion = "Unknown";
        if (pVersion == null) { return tVersion; }
        tVersion = GetVersionString(pVersion.ToString());
        return tVersion;
    }//string GetVersionString(Version pVersion)


    public static string GetVersionString(string pVersionString)
    {
        string tVersion = "Unknown";
        string[] aVersion;

        if (string.IsNullOrEmpty(pVersionString)) { return tVersion; }
        aVersion = pVersionString.Split('.');
        if (aVersion.Length > 0) { tVersion = aVersion[0]; }
        if (aVersion.Length > 1) { tVersion += "." + aVersion[1]; }
        if (aVersion.Length > 2) { tVersion += "." + aVersion[2].PadLeft(4, '0'); }
        if (aVersion.Length > 3) { tVersion += "." + aVersion[3].PadLeft(4, '0'); }

        return tVersion;
    }//string GetVersionString(Version pVersion)


    public static string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)
    {
        string tVersion = "Unknown";
        System.Reflection.Assembly tMyAssembly = null;

        tMyAssembly = GetAssemblyEmbedded(pAssemblyDisplayName);
        if (tMyAssembly == null) { return tVersion; }
        tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
        return tVersion;
    }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)


    public static string GetVersionStringFromAssemblyDLL(string pAssemblyDisplayName)
    {
        string tVersion = "Unknown";
        System.Reflection.Assembly tMyAssembly = null;

        tMyAssembly = GetAssemblyDLL(pAssemblyDisplayName);
        if (tMyAssembly == null) { return tVersion; }
        tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
        return tVersion;
    }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)


2

@Ben द्वारा उत्तर देना मेरे लिए उपयोगी साबित हुआ। लेकिन मुझे उत्पाद संस्करण की जांच करने की आवश्यकता थी क्योंकि यह मेरे सॉफ्टवेयर में हो रही मुख्य वृद्धि थी और सिमेंटिक संस्करण का पालन किया।

myFileVersionInfo.ProductVersion

यह तरीका मेरी उम्मीदों पर खरा उतरा

अपडेट: कार्यक्रम में स्पष्ट रूप से dll पथ का उल्लेख करने के बजाय (जैसा कि उत्पादन संस्करण में आवश्यक है), हम असेंबली का उपयोग करके उत्पाद संस्करण प्राप्त कर सकते हैं।

Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location); 
string ProdVersion= fileVersionInfo.ProductVersion;

नोट: यदि संस्करण में ऑटो-इन्क्रिम्ड वैल्यू के लिए तारांकन चिह्न होता है, तो यह विधि वास्तविक उत्पन्न संख्या के बजाय तारांकन को लौटाएगी (यदि आप अपनी विधानसभा जानकारी में 1.0 डालते हैं तो यह काम नहीं करता है)।
रोनेन नेस

हाँ! हालाँकि, मैंने संस्करण अपग्रेड के लिए जेनिकस ऑटोमेशन को चुना, इसलिए असेंबली में हमेशा dll संस्करण का सही संयोजन होता है।
प्रसंग दत्त

1

आप System.Reflection.Assembly.Load * () विधियों का उपयोग कर सकते हैं और फिर उनके असेंबली इनफो को पकड़ सकते हैं।


0

हालांकि मूल प्रश्न एक वेब सेवा के लिए विशिष्ट नहीं हो सकता है, यहां एक पूर्ण परीक्षण है जिसे आप वेब सेवा गैर-कैश्ड प्रतिक्रिया और फ़ाइल संस्करण के साथ प्रदर्शित करने के लिए जोड़ सकते हैं। हम असेंबली संस्करण के बजाय फ़ाइल संस्करण का उपयोग करते हैं क्योंकि हम एक संस्करण जानना चाहते हैं, लेकिन सभी विधानसभा संस्करणों के साथ 1.0.0.0, वेब साइट को आसानी से पैच किया जा सकता है (हस्ताक्षर और मांग लिंक अभी भी सक्रिय!)। वेब एफ़आई कंट्रोलर के नाम के साथ @ क्लास @ बदलें यह सेवा अंदर एम्बेडेड है। यह वेब सेवा पर जाने के लिए अच्छा है / प्लस एक त्वरित संस्करण की जांच है।

  [Route("api/testWebService")]
  [AllowAnonymous]
  [HttpGet]
  public HttpResponseMessage TestWebService()
  {
      HttpResponseMessage responseMessage = Request.CreateResponse(HttpStatusCode.OK);
      string loc = Assembly.GetAssembly(typeof(@Class@)).Location;
      FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(loc);
      responseMessage.Content = new StringContent($"<h2>The XXXXX web service GET test succeeded.</h2>{DateTime.Now}<br/><br/>File Version: {versionInfo.FileVersion}");
      responseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
      Request.RegisterForDispose(responseMessage);
      return responseMessage;
  }

मैंने पाया कि इसे विन्यास के तहत web.config से जोड़ना सही मायने में गुमनाम बनाने के लिए आवश्यक है

<location path="api/testwebservice">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.