বর্তমানে চালানো ডিএলএলটির অবস্থান কীভাবে পাবেন?


95

আমার কাছে একটি কনফিগার ফাইল রয়েছে যা আমি লিখছি এমন একটি ডেল প্রয়োগের অংশ হিসাবে লোড করা দরকার।

আমার যে সমস্যা হচ্ছে তা হ'ল অ্যাপটি চলাকালীন আমি dll এবং কনফিগার ফাইলটি যে জায়গাটি রেখেছি তা "বর্তমান অবস্থান" নয়।

উদাহরণস্বরূপ, আমি dll এবং xML ফাইলটি এখানে রেখেছি:

ডি: \ প্রোগ্রাম ফাইলগুলি \ মাইক্রোসফ্ট টিম ফাউন্ডেশন সার্ভার ২০১০ \ অ্যাপ্লিকেশন স্তর, ওয়েব পরিষেবাদি \ বিন \ প্লাগইন

তবে যদি আমি এই জাতীয় xML ফাইলটি (আমার dll তে) উল্লেখ করার চেষ্টা করি:

XDocument doc = XDocument.Load(@".\AggregatorItems.xml")

তারপরে \ AggregatorItems.xML এ অনুবাদ করে:

সি: \ উইন্ডোজ \ system32 \ inetsrv \ AggregatorItems.xML

সুতরাং, বর্তমানে চালানো যে ডিএলটি কোথায় রয়েছে তা জানার জন্য আমার একটি উপায় (আমি আশা করি) খুঁজে বের করতে হবে। মূলত আমি এটি সন্ধান করছি:

XDocument doc = XDocument.Load(CoolDLLClass.CurrentDirectory+@"\AggregatorItems.xml")

উত্তর:


142

আপনি খুঁজছেন System.Reflection.Assembly.GetExecutingAssembly()

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string xmlFileName = Path.Combine(assemblyFolder,"AggregatorItems.xml");

বিঃদ্রঃ:

.Locationসম্পত্তি বর্তমানে চলমান ডিএলএল ফাইলের অবস্থান ফেরৎ।

কিছু শর্তে ডিএলএলকে মৃত্যুদন্ড কার্যকর করার আগে ছায়া অনুলিপি করা হয়, এবং .Locationসম্পত্তিটি অনুলিপিটির পথে ফিরে আসবে। আপনি যদি মূল ডিএলএলটির পথ চান, তবে Assembly.GetExecutingAssembly().CodeBaseপরিবর্তে সম্পত্তিটি ব্যবহার করুন।

.CodeBaseএকটি উপসর্গ ( file:\) রয়েছে, যা আপনার অপসারণ করতে পারে।


8
হায়! এটি ফিরে আসেC:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
ভ্যাক্কানো

23
আহ! তবে Assembly.GetExecutingAssembly().CodeBaseআছে!
ভ্যাকাকানো

4
কোডবেস আমাকে ফাইল দিয়েছে: \\ সি: \ মায়াস্যাস্পেসপথ, যা অদ্ভুত
ম্যাট

10
@Matt ব্যবহার নতুন URI (। Assembly.GetExecutingAssembly () কোডবেস) .LocalPath একটি প্রকৃত নাম পেতে
ল্যারি

4
string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
মার্টিন কনেল

39

প্রতিফলন আপনার বন্ধু, যেমন উল্লেখ করা হয়েছে। তবে আপনার সঠিক পদ্ধতিটি ব্যবহার করা দরকার;

Assembly.GetEntryAssembly()     //gives you the entrypoint assembly for the process.
Assembly.GetCallingAssembly()   // gives you the assembly from which the current method was called.
Assembly.GetExecutingAssembly() // gives you the assembly in which the currently executing code is defined
Assembly.GetAssembly( Type t )  // gives you the assembly in which the specified type is defined.

17

আমার ক্ষেত্রে (আমার সমাবেশগুলি আউটলুকের মধ্যে লোড করা [ফাইল হিসাবে] ব্যবহার করে):

typeof(OneOfMyTypes).Assembly.CodeBase

এর উপর CodeBase(না Location) ব্যবহার নোট করুন Assembly। অন্যরা সমাবেশটি চিহ্নিত করার বিকল্প পদ্ধতিগুলি নির্দেশ করেছেন।



1

আপনি যদি একটি এসপ নেট অ্যাপ্লিকেশন নিয়ে কাজ করছেন এবং ডিবাগারটি ব্যবহার করার সময় আপনি সমাবেশগুলি সনাক্ত করতে চান তবে সেগুলি সাধারণত কিছু টেম্প ডিরেক্টরিতে রাখা হয়। এই দৃশ্যের সাহায্যে এই পদ্ধতিটি লিখেছিলাম।

private string[] GetAssembly(string[] assemblyNames)
{
    string [] locations = new string[assemblyNames.Length];


    for (int loop = 0; loop <= assemblyNames.Length - 1; loop++)       
    {
         locations[loop] = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic && a.ManifestModule.Name == assemblyNames[loop]).Select(a => a.Location).FirstOrDefault();
    }
    return locations;
}

আরও তথ্যের জন্য এই ব্লগ পোস্টটি দেখুন http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-asorses-in-net/

আপনি যদি সোর্স কোড, বা পুনরায় প্রচার করতে না পারেন তবে কম্পিউটারে চলমান প্রক্রিয়াগুলি প্রক্রিয়া এক্সপ্লোরার ব্যবহার করে পরীক্ষা করতে পারেন। আমি এখানে একটি বিশদ বিবরণ লিখেছি ।

এটি সিস্টেমে সমস্ত নির্বাহী ঘরের তালিকা তৈরি করবে, আপনার চলমান অ্যাপ্লিকেশনটির প্রসেস আইডি নির্ধারণ করতে আপনার প্রয়োজন হতে পারে, তবে এটি সাধারণত খুব কঠিন নয়।

আমি কীভাবে আইআইএসের অভ্যন্তরে ডেলির জন্য এটি করব তার সম্পূর্ণ বিবরণ লিখেছি - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executes-dll-on-a-running-web -সেসভার /

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