অন্য কয়েকটি উত্তরের পরামর্শগুলির বিপরীতে, গুণাবলীটি ব্যবহার DllImport
করা এখনও সঠিক পদ্ধতির approach
আমি কেন সত্যই বুঝতে পারছি না যে আপনি কেন বিশ্বের অন্য সবার মতো করতে পারবেন না এবং আপনার ডিএলএল সম্পর্কিত একটি আপেক্ষিক পথ নির্দিষ্ট করতে পারেন। হ্যাঁ, আপনার অ্যাপ্লিকেশনটি যে পদ্ধতিতে ইনস্টল করা হবে তা বিভিন্ন লোকের কম্পিউটারে পৃথক, তবে যখন এটি মোতায়েনের কথা আসে তখন এটি মূলত সর্বজনীন নিয়ম। এই বিষয়টি মাথায় রেখে DllImport
প্রক্রিয়াটি তৈরি করা হয়েছে।
আসলে এটি DllImport
এটিকে পরিচালনা করে না। এটি হিন্দি উইন 32 ডিএলএল লোডিংয়ের নিয়ম যা জিনিস পরিচালনা করে, আপনি হ্যান্ডি ম্যানেজড রেপার ব্যবহার করছেন কিনা তা বিবেচনা না করেই (পি / ইনভোক মার্শালার কেবল কল করেছেন LoadLibrary
)। এই বিধিগুলি এখানে বিস্তৃতভাবে গণনা করা হয়েছে , তবে গুরুত্বপূর্ণগুলি এখানে উদ্ধৃত হয়েছে:
সিস্টেমটি কোনও ডিএলএল অনুসন্ধান করার আগে এটি নিম্নলিখিতগুলি পরীক্ষা করে:
- যদি একই মডিউল নামের কোনও ডিএলএল ইতিমধ্যে মেমরিতে লোড করা থাকে তবে সিস্টেমটি লোডড ডিএলএল ব্যবহার করে, এটি যে ডিরেক্টরিতে থাকুক না কেন। সিস্টেমটি ডিএলএল অনুসন্ধান করে না।
- উইন্ডোজ যে সংস্করণটিতে অ্যাপ্লিকেশন চলছে তার সংস্করণটির জন্য যদি ডিএলএল পরিচিত ডিএলএলগুলির তালিকায় থাকে তবে সিস্টেমটি তার পরিচিত ডিএলএল (এবং পরিচিত ডিএলএল নির্ভর ডিএলএল, যদি থাকে) এর অনুলিপি ব্যবহার করে। সিস্টেমটি ডিএলএল অনুসন্ধান করে না।
যদি SafeDllSearchMode
সক্ষম হয় (ডিফল্ট), সন্ধান ক্রমটি নিম্নরূপ:
- যে ডিরেক্টরিটি থেকে অ্যাপ্লিকেশনটি লোড হয়েছে।
- সিস্টেম ডিরেক্টরি।
GetSystemDirectory
এই ডিরেক্টরিটির পথ পেতে ফাংশনটি ব্যবহার করুন ।
- 16-বিট সিস্টেম ডিরেক্টরি। এই ডিরেক্টরিটির পথ অর্জন করে এমন কোনও কার্য নেই, তবে এটি অনুসন্ধান করা হয়।
- উইন্ডোজ ডিরেক্টরি।
GetWindowsDirectory
এই ডিরেক্টরিটির পথ পেতে ফাংশনটি ব্যবহার করুন ।
- বর্তমান ডিরেক্টরি।
PATH
পরিবেশে পরিবর্তনশীল তালিকাভুক্ত ডিরেক্টরিগুলি । দ্রষ্টব্য যে এতে অ্যাপ পাথস রেজিস্ট্রি কী দ্বারা নির্দিষ্ট করা প্রতি অ্যাপ্লিকেশন পাথ অন্তর্ভুক্ত নয়। ডিএলএল অনুসন্ধানের পথের গণনা করার সময় অ্যাপ পাথ কী ব্যবহার করা হয় না।
সুতরাং, যদি না আপনি আপনার ডিএলএলকে সিস্টেম ডিএলএল হিসাবে একই নামকরণ করেন (যা আপনার সম্ভবত কোনও অবস্থাতেই করা উচিত নয়), আপনার অ্যাপ্লিকেশনটি লোড হওয়া ডিরেক্টরিটি ডিফল্ট অনুসন্ধান আদেশটি সন্ধান করা শুরু করবে। আপনি যদি ইনস্টল করার সময় সেখানে ডিএলএল রাখেন তবে এটি পাওয়া যাবে। আপনি যদি কেবলমাত্র আপেক্ষিক পাথ ব্যবহার করেন তবে সমস্ত জটিল সমস্যা চলে যায়।
শুধু লেখো:
[DllImport("MyAppDll.dll")] // relative path; just give the DLL's name
static extern bool MyGreatFunction(int myFirstParam, int mySecondParam);
তবে যদি এটি কোনও কারণে কার্যকর না হয় এবং আপনাকে ডিএলএলটির জন্য আলাদা ডিরেক্টরিতে অ্যাপ্লিকেশনটিকে বাধ্য করার প্রয়োজন হয়, আপনি SetDllDirectory
ফাংশনটি ব্যবহার করে ডিফল্ট অনুসন্ধানের পথটি পরিবর্তন করতে পারেন ।
নথি হিসাবে নোট করুন:
কল করার পরে SetDllDirectory
, মানক ডিএলএল অনুসন্ধানের পথটি হ'ল:
- যে ডিরেক্টরিটি থেকে অ্যাপ্লিকেশনটি লোড হয়েছে।
lpPathName
প্যারামিটার দ্বারা নির্দিষ্ট ডিরেক্টরি ।
- সিস্টেম ডিরেক্টরি।
GetSystemDirectory
এই ডিরেক্টরিটির পথ পেতে ফাংশনটি ব্যবহার করুন ।
- 16-বিট সিস্টেম ডিরেক্টরি। এই ডিরেক্টরিটির পথ অর্জন করে এমন কোনও কার্য নেই, তবে এটি অনুসন্ধান করা হয়।
- উইন্ডোজ ডিরেক্টরি।
GetWindowsDirectory
এই ডিরেক্টরিটির পথ পেতে ফাংশনটি ব্যবহার করুন ।
PATH
পরিবেশে পরিবর্তনশীল তালিকাভুক্ত ডিরেক্টরিগুলি ।
সুতরাং আপনি প্রথমবার ডিএলএল থেকে আমদানি করা ফাংশনটি কল করার আগে আপনি যতক্ষণ এই ফাংশনটি কল করবেন ততক্ষণ আপনি ডিএলএলগুলি সনাক্ত করতে ব্যবহৃত ডিফল্ট অনুসন্ধানের পথটি পরিবর্তন করতে পারবেন। অবশ্যই সুবিধাটি হ'ল আপনি রান-টাইমে গণনা করা এই ফাংশনটিতে একটি গতিশীল মান পাস করতে পারেন । DllImport
বৈশিষ্ট্যটি দিয়ে এটি সম্ভব নয় , সুতরাং আপনি এখনও সেখানে একটি আপেক্ষিক পথ (কেবলমাত্র ডিএলএলের নাম) ব্যবহার করবেন এবং এটি আপনার অনুসন্ধানের জন্য নতুন অনুসন্ধান ক্রমের উপর নির্ভর করুন।
আপনাকে এই ফাংশনটি পি / ইনভোক করতে হবে। ঘোষণাটি এর মতো দেখাচ্ছে:
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool SetDllDirectory(string lpPathName);