প্রোগ্রামিয়ালি একটি ডিএলএল সংস্করণ নম্বর পান


151

কোনও। নেট নেটএলএল থেকে প্রোগ্রামগতভাবে সংস্করণ নম্বর পাওয়া সম্ভব?

যদি হ্যাঁ, কিভাবে?


10
বিশ্বাস করা যায় না এটি 6 মিনিট আগে জিজ্ঞাসা করা হয়েছিল, ঠিক একই জিজ্ঞাসা করার কথা ছিল!
tpower

উত্তর:


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

গুরুত্বপূর্ণ: এটি লক্ষ করা উচিত যে এটি মূল প্রশ্নের সেরা উত্তর নয়। এই পৃষ্ঠায় আরও পড়তে ভুলবেন না।


28
এটি চলমান অ্যাপডোমেনের মধ্যে MyAsorses.dll লোড করে ... খারাপ ধারণা।
staafl

12
আমি Assemblyname.GetAssemblyNameএই সমস্যাগুলি এড়াতে পরামর্শ দিচ্ছি
staafl

7
অ্যাপডোমেনে একটি অ্যাসেমবিলি লোড করা ধীর, অপরিবর্তনীয় (আপনি ডোমেনটি হত্যা না করে এটি আনলোড করতে পারবেন না), অনুমতি প্রয়োজন এবং পার্শ্ব প্রতিক্রিয়া তৈরি করতে দায়বদ্ধ, যেমন beforefieldinitটাইপ ইনিশিয়ালাইজারকে কার্যকর করা, এবং এই ক্ষেত্রে কেবল প্রয়োজন হয় না। এই কারণগুলি কি যথেষ্ট শোনায়?
staafl

7
@ স্টাফল: হ্যাঁ; কেবল আমার জন্য নয়, ভবিষ্যতে এই পৃষ্ঠাটি পড়ার প্রত্যেকের জন্যও।
ক্রিস

6
FileVersionInfo.GetVersionInfo("foo.dll").FileVersionকাজটি ভাল করে এবং অ্যাপ্লিকেশনটিতে dll লোড করে না।
জ্যাক

181

এটি কাজ করে যদি dll। নেট বা Win32 হয় । প্রতিবিম্বের পদ্ধতিগুলি কেবলমাত্র dll। নেট হলে কাজ করে। এছাড়াও, আপনি যদি প্রতিবিম্ব ব্যবহার করেন তবে পুরো ডেলটি মেমরিতে লোড করার ওভারহেড আপনার রয়েছে। নীচের পদ্ধতিটি অ্যাসেমব্লিকে মেমরিতে লোড করে না।

// 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);

প্রেরণ থেকে:

মূল উৎস


5
আমি এই পছন্দ। আপনি ডেল লোড করার জন্য কেন বিরক্ত হবেন এবং তারপরে সংস্করণটি পেতে কেবল প্রতিবিম্ব ব্যবহার করবেন, যখন আপনি সত্যিই যা করতে চান তা এই কি ???
aggieNick02

@ বেন, আপনি কি পোস্টটি সম্পাদনা করতে পারবেন? আমি দেখেছি যে ডাউনওয়েট যুক্ত করা থেকে আমি -1 সংবাদ হারিয়েছি, যা আমি মনে করি না। আপনি পোস্টটি সম্পাদনা না করলে এটি আমাকে পরিবর্তন করতে দেবে না। চিয়ার্স!
লুক ডুড্রিজ

9
আপনি যদি নিশ্চিত করতে চান যে আপনি বর্তমানে ব্যবহারযোগ্য / dll ব্যবহার করছেন: স্থির ফাইলের পরিবর্তে ( @"C:\MyAssembly.dll"উপরে), আপনি ব্যবহার করতে পারেন System.Reflection.Assembly.GetExecutingAssembly().Location(বা যদি একটি dll Assembly.GetAssembly(typeof(AClassInTheDll)).Location:)
কনরাড

4
এটি এসেম্বলি ভার্সন এবং এসেম্বলিফিলিভিশন বৈশিষ্ট্যের মধ্যে পার্থক্য। উইন্ডোজ এপিআই মান পেতে পারে এমনভাবে এসেম্বলিফিলভিশনটি স্ট্যাম্পড হয়ে যায়। অ্যাসেম্বলি ভার্সন শক্তিশালী নামের একটি অংশ এবং অগত্যা এসেম্বলি ফাইল ভার্সনের মতো নয়।
দৌগে

51

প্রথমত, দুটি সম্ভাব্য 'সংস্করণ' রয়েছে যাতে আপনার আগ্রহী হতে পারে:

  • উইন্ডোজ ফাইল সিস্টেম ফাইল সংস্করণ, সমস্ত এক্সিকিউটেবল ফাইলের জন্য প্রযোজ্য

  • এসেম্বল বিল্ড সংস্করণ, যা সংকলক দ্বারা একটি নেট নেট এম্বেড এম্বেড করা আছে (স্পষ্টতই কেবল নেট নেট এসেম্বলিং ডেল এবং এক্স ফাইলের ক্ষেত্রে প্রযোজ্য)

আগের ক্ষেত্রে, আপনার বেন অ্যান্ডারসনের উত্তরটি ব্যবহার করা উচিত; পরবর্তী ক্ষেত্রে, ব্যবহার AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version, বা তাতারোর উত্তর, যদি আপনার কোড দ্বারা সমাবেশটি উল্লেখ করা হয়।

নোট করুন যে আপনি যে সমস্ত উত্তরগুলি .Load()/ .LoadFrom()পদ্ধতিগুলি ব্যবহার করেন সেগুলি আপনি এড়াতে পারবেন , যেহেতু এগুলি আসলে বর্তমান অ্যাপডোমাইনে অ্যাসেমব্লিকে লোড করে - যা গাছটি কত পুরানো তা দেখার জন্য সমান an


32

নির্দিষ্ট শ্রেণীর সমন্বিত একটি ডিএলএল সংস্করণ পেতে কিছুটা প্রতিবিম্ব ব্যবহার করে এখানে একটি দুর্দান্ত উপায়:

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

ক্লাস! আপনি যে সংস্করণটি পেতে চান তা ডিএলএল সংজ্ঞায়িত এমন শ্রেণীর নাম সহ with

এটি আমার পছন্দের পদ্ধতি কারণ আমি যদি ডিপ্লোসগুলি বিভিন্ন মোতায়েনের জন্য ঘুরে দেখি তবে আমাকে ফাইলপথটি পরিবর্তন করতে হবে না।


3
মনে রাখবেন যে এটি কেবল তখনই কাজ করে যদি প্রশ্নে থাকা সমাবেশটি স্থায়ীভাবে বর্তমানের দ্বারা রেফারেন্স করা হয়।
staafl

2
এটি সেরা উত্তর যেহেতু ডিএলএল অগত্যা এন্ট্রি এসেম্বলি নয় এমনকি যে সমাবেশ থেকেও আহ্বান করা হয়েছিল তা নয়
সিএডি ব্লোক

1
বিভিন্ন ধরণের সংস্করণ তথ্য পেতে স্ট্যাকওভারফ্লো.com/a/909583/492 দেখুন । উদাহরণস্বরূপFileVersionInfo
সিএডি

22

এটি যে সমাবেশ শুরু হয়েছিল তা পাওয়ার জন্য (উইনফর্ম, কনসোল অ্যাপ্লিকেশন ইত্যাদি ...)

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

6
গেটএক্সেকিউটিংএএসবুলেশন () এছাড়াও সহায়তা করতে পারে।
বোল্ট থান্ডার

10

ক্রিস, আসল ডিএলএল ফাইল থেকে অ্যাসেম্বলি লোড করার দরকার পড়লে আপনার সংস্করণ দুর্দান্ত কাজ করে (এবং যদি ডিএলএল থাকে!) তবে, ডিএলএল এম্বেডেড থাকে (তবে, কোনও ফাইল নয় তবে একটি এম্বেড থাকা) একটি খুব অযাচিত ত্রুটি পাবে one ডিএলএল)।

অন্যটি বিষয় হ'ল, যদি কেউ " 1.2012.0508.0101 " এর মতো কিছু সহ একটি সংস্করণ স্কিম ব্যবহার করে , যখন কেউ সংস্করণটির স্ট্রিং পেয়ে যায় আপনি আসলে " 1.2012.518.101 " পাবেন; অনুপস্থিত শূন্যগুলি নোট করুন

সুতরাং, ডিএলএল (এম্বেড করা বা ডিএলএল ফাইল থেকে) এর সংস্করণটি পেতে এখানে কয়েকটি অতিরিক্ত ফাংশন রয়েছে:

    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

@ বেন দ্বারা উত্তর আমার পক্ষে দরকারী বলে প্রমাণিত হয়েছে। তবে আমার পণ্যটির সংস্করণটি যাচাই করা দরকার কারণ এটি আমার সফ্টওয়্যারটিতে প্রধান বর্ধিত ছিল এবং অর্থপূর্ণ সংস্করণ অনুসরণ করেছিল followed

myFileVersionInfo.ProductVersion

এই পদ্ধতিটি আমার প্রত্যাশা পূরণ করেছিল

আপডেট: প্রোগ্রামে স্পষ্টভাবে dll পথ উল্লেখ করার পরিবর্তে (উত্পাদন সংস্করণে প্রয়োজন হিসাবে), আমরা সমাবেশ ব্যবহার করে পণ্য সংস্করণ পেতে পারি।

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

দ্রষ্টব্য: যদি সংস্করণটিতে স্ব-বর্ধিত মানের জন্য নক্ষত্র থাকে তবে এই পদ্ধতিটি প্রকৃত উত্পন্ন সংখ্যার পরিবর্তে তারকাচিহ্নটি ফিরিয়ে দেবে (যেমন আপনি যদি আপনার সমাবেশ তথ্যটিতে 1.0 রাখেন তবে কাজ করে না)।
রোনেন নেস

হ্যাঁ! যাইহোক, আমি জেনিক্স অটোমেশনটি সংস্করণ আপগ্রেডের জন্য বেছে নিয়েছি যাতে সমাবেশে সবসময়ই dll সংস্করণটির নিখুঁত সংমিশ্রণ থাকে।
প্রসান দত্ত

1

আপনি System.Reflection.Asorses.Load * () পদ্ধতিগুলি ব্যবহার করতে পারেন এবং তারপরে তাদের এসেম্বলআইএনফোটি ধরুন।


0

মূল প্রশ্নটি কোনও ওয়েব পরিষেবায় সুনির্দিষ্ট নাও থাকতে পারে, তবে এখানে একটি সম্পূর্ণ পরীক্ষা ওয়েবে পরিষেবা রয়েছে যা আপনি কোনও ওয়েব পরিষেবা নন-ক্যাশেড প্রতিক্রিয়া এবং ফাইল সংস্করণ প্রদর্শন করতে যুক্ত করতে পারেন। আমরা অ্যাসেম্বলি সংস্করণের পরিবর্তে ফাইল সংস্করণ ব্যবহার করি কারণ আমরা একটি সংস্করণ জানতে চাই, তবে সমস্ত অ্যাসেম্বলি সংস্করণ 1.0.0.0 এর সাথে ওয়েব সাইটটি সহজেই প্যাচ করা যায় (সাইন ইন এবং ডিমান্ড লিঙ্কটি এখনও সক্রিয়!)। @ ক্লাস @ কে এই ওয়েব এমপি এম্বেড করা ওয়েব এপিআই কন্ট্রোলারের নামের সাথে প্রতিস্থাপন করুন a ওয়েব সার্ভিসটিতে তাত্ক্ষণিকভাবে একটি দ্রুত সংস্করণ চেক করা ভাল / নোগোর পক্ষে ভাল।

  [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;
  }

এটিকে সত্যই বেনামে পরিণত করতে কনফিগারেশনের অধীনে ওয়েবকনফিগটিতে নিম্নলিখিতগুলি যুক্ত করাও আমার প্রয়োজনীয় মনে হয়েছে

<location path="api/testwebservice">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.