.NET2.0-এ আমি কীভাবে প্রোগ্রামের মাধ্যমে কোনও অ্যাপ্লিকেশনটির জিআইডি পাই get


102

সি # .NET2.0 এ আমার প্রকল্পের সমাবেশটি অ্যাক্সেস করতে হবে।

আমি প্রকল্পের অধীনে 'অ্যাসেম্বলি ইনফরমেশন' ডায়ালগের জিইউডিটি দেখতে পাচ্ছি এবং এই মুহুর্তে আমি কেবল কোডটিতে কোনও কনস্টে এটি অনুলিপি করেছি। জিইউইডি কখনই পরিবর্তন হবে না, সুতরাং এটি কোনও সমাধানের পক্ষে খারাপ নয়, তবে এটি সরাসরি অ্যাক্সেস করে ভাল লাগবে। এই কাজ করতে একটি উপায় আছে কি?

উত্তর:


154

নিম্নলিখিত কোড ব্যবহার করে দেখুন। আপনি যে মানটির সন্ধান করছেন তা অ্যাসেমব্লির সাথে সংযুক্ত একটি গাইড অ্যাট্রিবিউট ইনসেন্টে সংরক্ষণ করা হয়

using System.Runtime.InteropServices;

static void Main(string[] args)
{
    var assembly = typeof(Program).Assembly;
    var attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute),true)[0];
    var id = attribute.Value;
    Console.WriteLine(id);
}

4
টাইপফোর (প্রোগ্রাম) এর পরিবর্তে 'অ্যাপডোমাইন.কন্টেনডোমাইন.ডমেন ম্যানেজ.আর্ট্রিঅ্যাস্পাবলস' ব্যবহার সম্পর্কে কীভাবে? ঠিক আছে, আমরা প্রোগ্রাম ক্লাসের নাম পরিবর্তন করতে পারি, তাই না?
কেনিয়াল

11
গুগলিংয়ের কয়েক সেকেন্ড অন্য কাউকে বাঁচাতে গুইডএট্রিবিউট নামস্থান স্থানটিতে রয়েছে un রুনটাইম.আইন্টারনেস সার্ভিস।
ব্রাইস ওয়াগনার

5
@BryceWagner ctrl+.আপনার বন্ধু
maxp

@ কেনিয়াল আমি System.AppDomain.DomainManager.get returned null.একটি সাধারণ কনসোল অ্যাপ্লিকেশন পেয়েছি । মনে হচ্ছে Assembly.GetEntryAssembly()পছন্দসই উপায়।
জেসি সি স্লিকার

11

আরেকটি উপায় ব্যবহার করা Marshal.GetTypeLibGuidForAssembly

এমএসডিএন অনুসারে:

যখন সমাবেশগুলি টাইপ লাইব্রেরিতে রফতানি করা হয়, টাইপ লাইব্রেরিকে একটি এলআইবিআইডি বরাদ্দ করা হয়। আপনি সিস্টেমটি প্রয়োগ করুন দ্বারা স্পষ্টভাবে LIBID সেট করতে পারেন। Tlbimp.exe (প্রকার লাইব্রেরি আমদানিকারক) সরঞ্জাম সমাবেশের পরিচয়ের ভিত্তিতে একটি LIBID মান গণনা করে। গেটটাইপলিবগুইড বৈশিষ্ট্যটি প্রয়োগ করা হলে গিডিঅ্যাট্রিবিউটের সাথে যুক্ত এলআইবিডিকে ফেরত দেয়। অন্যথায়, getTypeLibGuidForAs आशीर्वाद গণিত মান প্রদান করে। বিকল্পভাবে, আপনি বিদ্যমান টাইপ লাইব্রেরি থেকে প্রকৃত LIBID নিষ্কাশন করতে getTypeLibGuid পদ্ধতি ব্যবহার করতে পারেন।


আমি এফ # মধ্যে এই কাজ করতে সক্ষম ছিল, মনে সমাবেশ GUID সঙ্গে একটি কাস্টম অ্যাট্রিবিউট নেই যে
fableal

Assembly.ReflectionOnlyLoadনির্ভরশীল অ্যাসেম্বলিসিগুলি লোড না হওয়ার পরেও এই পদ্ধতিটি কাজ করে ।
মার্টিন লটারিং

সুতরাং, পূর্ণ কোড হল: System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString()। অন্যান্য পদ্ধতির তুলনায় অনেক সহজ দেখাচ্ছে। কোন ডাউনসাইড আছে?
ব্যবহারকারী

7

বা, ঠিক যেমন সহজ:

string assyGuid = Assembly.GetExecutingAssembly().GetCustomAttribute<GuidAttribute>().Value.ToUpper();

আমার জন্য কাজ কর...


6

আপনার প্রতিফলনের মাধ্যমে সমাবেশের গাইড বৈশিষ্ট্যটি পড়তে সক্ষম হওয়া উচিত। এটি বর্তমান বিধানসভার জন্য জিইউডি পাবে

         Assembly asm = Assembly.GetExecutingAssembly();
        var attribs = (asm.GetCustomAttributes(typeof(GuidAttribute), true));
        Console.WriteLine((attribs[0] as GuidAttribute).Value);

আপনি যদি এসিডেলিটিটল, এসেম্বলি ভার্সন ইত্যাদির মতো জিনিসগুলি পড়তে চান তবে আপনি অন্যান্য বৈশিষ্ট্যগুলির সাথেও গাইড অ্যাট্রিবিউটকে প্রতিস্থাপন করতে পারেন You

আপনি বর্তমান অ্যাসেম্বলি পাওয়ার পরিবর্তে অন্য একটি অ্যাসেম্বলি (এসেম্বলি.লুডফর্ম এবং সমস্ত) লোড করতে পারেন - আপনার যদি বাহ্যিক সমাবেশগুলির এই বৈশিষ্ট্যগুলি পড়ার প্রয়োজন হয় (যেমন - প্লাগইন লোড করার সময়)


6
আপনি যদি যাই হোক না কেন ভোটদানের ফলাফলটি ব্যবহার করতে যাচ্ছেন তবে দয়া করে "হিসাবে" কাস্ট ব্যবহার করবেন না। এটি সাধারণত খারাপ শৈলী কারণ আপনি যদি কাস্ট ব্যর্থ হন তবে আরও তথ্যবহুল অবৈধকাস্টএক্সসেপ্টের পরিবর্তে নালারফেরান এক্সেক্সপেশন পান। "হিসাবে" কাস্টগুলি তখন যখন আপনি জানেন না যে অবজেক্টটি প্রদত্ত প্রকারের কিনা এবং কেবল এটির ক্ষেত্রে এটি ব্যবহার করতে চান। কেবলমাত্র একটি সরাসরি ((গাইড অ্যাট্রিবিউট) সংযুক্তি [0]) ব্যবহার করুন পরিবর্তে মানটি যদি আপনি এটি অন্য ধরণের হয়ে
উঠার প্রত্যাশা

6

যদি অন্য কেউ বাকী কাজের উদাহরণ খুঁজে বের করে, তবে পূর্ববর্তী উত্তরের উপর ভিত্তি করে আমি এটি শেষ করেছি।

using System.Reflection;
using System.Runtime.InteropServices;

label1.Text = "GUID: " + ((GuidAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(GuidAttribute), false)).Value.ToUpper();

হালনাগাদ:

যেহেতু এটি কিছুটা মনোযোগ অর্জন করেছে আমি সিদ্ধান্ত নিয়েছি যে আমি এটি ব্যবহার করার অন্য একটি পদ্ধতি অন্তর্ভুক্ত করব। এই উপায় আপনাকে এটি একটি স্ট্যাটিক শ্রেণি থেকে ব্যবহার করতে দেয়:

    /// <summary>
    /// public GUID property for use in static class </summary>
    /// <returns> 
    /// Returns the application GUID or "" if unable to get it. </returns>
    static public string AssemblyGuid
    {
        get
        {
            object[] attributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(GuidAttribute), false);
            if (attributes.Length == 0) { return String.Empty; }
            return ((System.Runtime.InteropServices.GuidAttribute)attributes[0]).Value.ToUpper();
        }
    }

1

অ্যাপিডটি পেতে আপনি নিম্নলিখিত কোডের লাইনটি ব্যবহার করতে পারেন:

var applicationId = ((GuidAttribute)typeof(Program).Assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value;

এর জন্য আপনাকে অবশ্যই অন্তর্ভুক্ত করতে হবে System.Runtime.InteropServices;


1

এখানে অন্য উত্তরগুলির জন্য ভাগ্য নেই তবে এই দুর্দান্ত একটি লাইনারের সাথে এটি কার্যকরভাবে পরিচালিত হয়েছে:

((GuidAttribute)(AppDomain.CurrentDomain.DomainManager.EntryAssembly).GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value

আশাকরি এটা সাহায্য করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.