আমাকে বেশ কয়েকবার এটি করতে হয়েছিল এবং বিভিন্ন বিভিন্ন সমাধান নিয়ে গবেষণা করেছি।
আমি সর্বাধিক মার্জিত এবং সাধন করতে সহজ সমাধানটি এরূপে প্রয়োগ করা যেতে পারে।
1. এমন একটি প্রকল্প তৈরি করুন যা আপনি একটি সাধারণ ইন্টারফেস তৈরি করতে পারেন
ইন্টারফেসে আপনি যে কোনও সদস্যের কল করতে চান তার স্বাক্ষর থাকবে।
public interface IExampleProxy
{
string HelloWorld( string name );
}
এই প্রকল্পটি পরিষ্কার এবং হালকা রাখা এটি গুরুত্বপূর্ণ। এটি এমন একটি প্রকল্প যা উভয়ই AppDomain
রেফারেন্স করতে পারে এবং আমাদেরকে রেফারেন্স না দেওয়ার অনুমতি দেয়Assembly
দিতে পারে এবং আমাদের ক্লায়েন্ট অ্যাসেম্বলি থেকে সেপ্রেট ডোমেনে লোড করতে ইচ্ছুক ।
২. এখন এমন প্রকল্প তৈরি করুন যার কোডটি আপনি পৃথকভাবে লোড করতে চান has AppDomain
।
ক্লায়েন্ট প্রজ হিসাবে এই প্রকল্পটি প্রক্সি প্রজকে উল্লেখ করবে এবং আপনি ইন্টারফেসটি প্রয়োগ করবেন।
public interface Example : MarshalByRefObject, IExampleProxy
{
public string HelloWorld( string name )
{
return $"Hello '{ name }'";
}
}
৩. পরবর্তী, ক্লায়েন্ট প্রকল্পে, অন্যটিতে কোড লোড করুন AppDomain
।
সুতরাং, এখন আমরা একটি নতুন তৈরি AppDomain
। সমাবেশ রেফারেন্সের জন্য বেস অবস্থান নির্দিষ্ট করতে পারে। অনুসন্ধানের ফলে জিএসি এবং বর্তমান ডিরেক্টরি এবং AppDomain
বেস লোকের উপর নির্ভরশীল অ্যাসেমব্লিগুলির জন্য পরীক্ষা করা হবে ।
// set up domain and create
AppDomainSetup domaininfo = new AppDomainSetup
{
ApplicationBase = System.Environment.CurrentDirectory
};
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
AppDomain exampleDomain = AppDomain.CreateDomain("Example", adevidence, domaininfo);
// assembly ant data names
var assemblyName = "<AssemblyName>, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null|<keyIfSigned>";
var exampleTypeName = "Example";
// Optional - get a reflection only assembly type reference
var @type = Assembly.ReflectionOnlyLoad( assemblyName ).GetType( exampleTypeName );
// create a instance of the `Example` and assign to proxy type variable
IExampleProxy proxy= ( IExampleProxy )exampleDomain.CreateInstanceAndUnwrap( assemblyName, exampleTypeName );
// Optional - if you got a type ref
IExampleProxy proxy= ( IExampleProxy )exampleDomain.CreateInstanceAndUnwrap( @type.Assembly.Name, @type.Name );
// call any members you wish
var stringFromOtherAd = proxy.HelloWorld( "Tommy" );
// unload the `AppDomain`
AppDomain.Unload( exampleDomain );
আপনার যদি প্রয়োজন হয় তবে অ্যাসেম্বলি লোড করার বিভিন্ন উপায় রয়েছে। আপনি এই সমাধানটি দিয়ে অন্য কোনও উপায়ে ব্যবহার করতে পারেন। আপনার যদি সমাবেশের যোগ্য নামটি থাকে তবে আমি CreateInstanceAndUnwrap
এটি ব্যবহার করতে পছন্দ করি কারণ এটি সমাবেশ বাইটগুলি লোড করে এবং আপনার জন্য আপনার প্রকারটি ইনস্ট্যান্ট করে এবং object
এমন একটি ফেরত দেয় যা আপনি আপনার প্রক্সি টাইপে সহজ কাস্ট করতে পারেন বা যদি আপনি তা জোরালোভাবে টাইপ করা কোডটিতে না পারেন গতিশীল ভাষার রানটাইম ব্যবহার করুন এবং প্রত্যাবর্তিত অবজেক্টটি একটি dynamic
টাইপড ভেরিয়েবলের জন্য বরাদ্দ করুন তারপরে সরাসরি সেই সদস্যদের কল করুন members
ওখানে তোমার আছে।
এটি এমন কোনও সংসদীয় লোড করতে দেয় যা আপনার ক্লায়েন্ট প্রজকে পৃথকভাবে রেফারেন্স দেয় না AppDomain
ক্লায়েন্টের কাছ থেকে সদস্যদের কল করতে পারে।
পরীক্ষা করতে, আমি ভিজ্যুয়াল স্টুডিওতে মডিউল উইন্ডোটি ব্যবহার করতে চাই। এটি আপনাকে আপনার ক্লায়েন্ট অ্যাসেম্বলি ডোমেন এবং সেই ডোমেনে কীভাবে সমস্ত মডিউল লোড করা হয়েছে তা আপনার নতুন অ্যাপ্লিকেশন ডোমেন এবং সেই ডোমেনে কী অ্যাসেম্বলি বা মডিউলগুলি লোড করা হবে তা আপনাকে দেখায়।
কীটি হয় আপনার কোডটি উদ্ভুত হয়েছে তা নিশ্চিত করা MarshalByRefObject
বা সিরিয়ালাইজযোগ্য ।
`মার্শালবিআরআইফঅজেক্ট আপনাকে ডোমেনটির আজীবন কনফিগার করার অনুমতি দেবে, উদাহরণস্বরূপ, বলুন আপনি যদি প্রক্সির 20 মিনিটের মধ্যে ডাকা না হয় তবে আপনি ডোমেনটি ধ্বংস করতে চান।
আশা করি এটা কাজে লাগবে.