मैं निष्पादित विधानसभा संस्करण कैसे प्राप्त कर सकता हूं?


169

मैं निम्नलिखित कोड का उपयोग करके C # 3.0 में निष्पादित विधानसभा संस्करण प्राप्त करने का प्रयास कर रहा हूं:

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

क्या ऐसा करने का एक और उचित तरीका है?

जवाबों:


293

दो विकल्प ... आवेदन प्रकार की परवाह किए बिना आप हमेशा चालान कर सकते हैं:

Assembly.GetExecutingAssembly().GetName().Version

यदि कोई Windows प्रपत्र अनुप्रयोग, आप हमेशा उत्पाद संस्करण के लिए देख रहे हैं, तो अनुप्रयोग के माध्यम से पहुँच सकते हैं।

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
जस्टिन मॉर्गन

क्या दिलचस्प होगा: आपको वास्तविक संस्करण को निर्दिष्ट करने की आवश्यकता कहां है? मैंने अपने असेंबली Info.cs में असेंबली विचलन और असेंबली फ़ाइलेविज़न निर्दिष्ट किया है और उपरोक्त सभी से मैं कॉल कर रहा हूं: 0.0.0.0 निर्दिष्ट 1.0.0 होने के बावजूद
AgentKnopf

@Zainodis यदि आप ClickOnce@Justin द्वारा उल्लिखित संस्करण का उल्लेख कर रहे हैं , तो यह Publishपरियोजना के गुणों के भीतर टैब पर निर्दिष्ट किया गया है (अर्थात, असेंबलीव्यू या असेंबली फ़ाइलवेशन से संबंधित नहीं)।
क्रिस बैक्सटर

@CalgaryCoder प्रतिक्रिया के लिए धन्यवाद, मुझे नहीं पता कि ClickOnce क्या है, लेकिन जब वी.एस. के माध्यम से असेंबलीइन्फो फाइल को संपादित करते समय यह निकला तो यह अचानक काम कर गया। असेंबलीInfo.cas को मैन्युअल रूप से पाठ संपादक में संपादित करने से सभी फ़ील्ड खाली हो जाते हैं। किसी भी तरह से, यह अब हल है :)
AgentKnopf

7
यह उल्लेख के लायक है कि यह ASP.NET MVC ऐप्स में काम नहीं करता है, क्योंकि लॉन्च संदर्भ है। वर्कअराउंड अपनी वेबसाइट असेंबली में एक ज्ञात प्रकार को संदर्भित करना है, जैसे सर्वव्यापी एमवीसी HomeController, इसलिए रेजर में:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
जेम्स मैककॉर्मैक

38

MSDN में, असेंबली .GetExecutingAssembly विधि , विधि "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

बेशक यह सहायक वर्ग "सार्वजनिक स्टेटिक क्लास 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जब विधानसभा में कामयाब एक एक अप्रबंधित आवेदन से लोड किया गया है। उदाहरण के लिए, यदि कोई अप्रबंधित एप्लिकेशन C # में लिखे गए COM घटक का एक उदाहरण बनाता है, तो GetEntryAssemblyC # घटक रिटर्न से विधि पर कॉल करता है null, क्योंकि प्रक्रिया के लिए प्रवेश बिंदु प्रबंधित असेंबली के बजाय अप्रबंधित कोड था।


2
+1। GetEntryAssembly(बनाम GetCallingAssemblyया GetExecutingAssembly) केवल एक चीज प्रतीत होती है जो एक संदर्भ पुस्तकालय के भीतर से कॉल करने पर काम करती है।
प्रातः

6

यह करना चाहिए:

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

5
यह 3 पंक्तियाँ 1 बन सकती हैं: असेंबली लौटाएँ। GetExecutingAssembly ()। GetName ()। Version.ToString (); .............
अलेक्जेंड्रे

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

यहां छवि विवरण दर्ज करें

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