কীভাবে কোনও অ্যাসেম্বলি অ্যাপসডমাইনে সমস্ত উল্লেখ সহ পুনরাবৃত্তির সাথে লোড করবেন?


113

আমি একটি নতুন AppDomainকিছু সমাবেশে লোড করতে চাই যার একটি জটিল রেফারেন্স ট্রি রয়েছে (MyDll.dll -> Microsoft.Office.Interop.Excel.dll -> Microsoft.Vbe.Interop.dll -> Office.dll -> stdole.dll)

আমি যতদূর বুঝতে পেরেছি, যখন কোনও অ্যাসেম্বলি লোড করা হচ্ছে AppDomain, এর উল্লেখগুলি স্বয়ংক্রিয়ভাবে লোড হবে না এবং আমি সেগুলি ম্যানুয়ালি লোড করতে হবে। সুতরাং আমি যখন:

string dir = @"SomePath"; // different from AppDomain.CurrentDomain.BaseDirectory
string path = System.IO.Path.Combine(dir, "MyDll.dll");

AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
setup.ApplicationBase = dir;
AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup);

domain.Load(AssemblyName.GetAssemblyName(path));

এবং পেয়েছি FileNotFoundException:

ফাইল বা সমাবেশ 'মাইডিল, সংস্করণ = 1.0.0.0, সংস্কৃতি = নিরপেক্ষ, পাবলিককি টোকেন = নাল' বা এর অন্যতম নির্ভরতা লোড করা যায়নি। সিস্টেম নির্দিষ্ট ফাইল খুঁজে পাচ্ছি না.

আমি মনে করি মূল অংশটি এর অন্যতম নির্ভরতা

ঠিক আছে, আমি এর আগেও করি domain.Load(AssemblyName.GetAssemblyName(path));

foreach (AssemblyName refAsmName in Assembly.ReflectionOnlyLoadFrom(path).GetReferencedAssemblies())
{
    domain.Load(refAsmName);
}

কিন্তু FileNotFoundExceptionআবার পেয়েছি , অন্য একটি (রেফারেন্সড) অ্যাসেমব্লিতে।

কীভাবে সমস্ত রেফারেন্স পুনরাবৃত্তভাবে লোড করবেন?

মূল সমাবেশটি লোড করার আগে আমার কি রেফারেন্স ট্রি তৈরি করতে হবে? এটি কোনও লোড না করে কোনও সমাবেশের রেফারেন্স কীভাবে পাবেন?


1
আমি এর আগেও বহুবার এসেম্বলিগুলি লোড করেছি, এর সমস্ত উল্লেখগুলি আমাকে নিজেই লোড করতে হয়নি। আমি নিশ্চিত না যে এই প্রশ্নের ভিত্তিটি সঠিক কিনা।
মিক 7

উত্তর:


68

CreateInstanceAndUnwrapআপনার প্রক্সি অবজেক্টটি বিদেশী অ্যাপ্লিকেশন ডোমেনে কার্যকর করার আগে আপনাকে অনুরোধ করতে হবে।

 class Program
{
    static void Main(string[] args)
    {
        AppDomainSetup domaininfo = new AppDomainSetup();
        domaininfo.ApplicationBase = System.Environment.CurrentDirectory;
        Evidence adevidence = AppDomain.CurrentDomain.Evidence;
        AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, domaininfo);

        Type type = typeof(Proxy);
        var value = (Proxy)domain.CreateInstanceAndUnwrap(
            type.Assembly.FullName,
            type.FullName);

        var assembly = value.GetAssembly(args[0]);
        // AppDomain.Unload(domain);
    }
}

public class Proxy : MarshalByRefObject
{
    public Assembly GetAssembly(string assemblyPath)
    {
        try
        {
            return Assembly.LoadFile(assemblyPath);
        }
        catch (Exception)
        {
            return null;
            // throw new InvalidOperationException(ex);
        }
    }
}

এছাড়াও, মনে রাখবেন যে আপনি যদি ব্যবহার করেন তবে আপনি LoadFromসম্ভবত একটি FileNotFoundব্যতিক্রম পাবেন কারণ এসেম্বলির সমাধানকারী আপনি যে সমাবেশটি জিএসি বা বর্তমান অ্যাপ্লিকেশনটির বিন ফোল্ডারে লোড করছেন তা সন্ধান করার চেষ্টা করবে। LoadFileপরিবর্তে একটি স্বেচ্ছাসেবক ফাইল ফাইল লোড করতে ব্যবহার করুন - তবে মনে রাখবেন যে আপনি যদি এটি করেন তবে আপনাকে কোনও নির্ভরতা নিজেই লোড করতে হবে।


20
এই সমস্যাটি সমাধান করার জন্য আমি যে কোডটি লিখেছি তা পরীক্ষা করে দেখুন: github.com/jduv/appDomainToolkit । বিশেষতঃ, এই শ্রেণীর লোডঅ্যাস্পাবলিপিথাইরফারেন্স পদ্ধতিটি দেখুন: github.com/jduv/appDomainToolkit/blob/master/appDomainToolkit/…
Jduv

3
আমি খুঁজে পেয়েছি যে যদিও এটি বেশিরভাগ সময় কাজ করে তবে কিছু ক্ষেত্রে আপনার এখনও এই এমএসডিএন উত্তরেAppDomain.CurrentDomain.AssemblyResolve বর্ণিত ইভেন্টের সাথে একটি হ্যান্ডলার সংযুক্ত করতে হবে । আমার ক্ষেত্রে, আমি এমএসটিস্টের অধীনে চলমান স্পেশরুন মোতায়েনের দিকে ঝুঁকতে চেষ্টা করছিলাম, তবে আমি মনে করি এটি এমন অনেক পরিস্থিতিতে প্রযোজ্য যেখানে আপনার কোডটি "প্রাথমিক" অ্যাপডোমাইন - ভিএস এক্সটেনশনগুলি,
এমএসটিস্ট

আহ আকর্ষণীয়। আমি এটি খতিয়ে দেখব এবং এডিটি এর মাধ্যমে আমি কাজটি আরও সহজ করতে পারি কিনা তা দেখুন। দুঃখিত যে কোডটি কিছুক্ষণের জন্য কিছুটা মরে গেছে - আমাদের সকলেরই দিনের কাজ রয়েছে :)।
Jduv

@ জডুভ আমি করতে পারলে আপনার মন্তব্যটি প্রায় 100 বার উচ্চারণ করবে। আপনার গ্রন্থাগারটি আমাকে এমএসবাইলের অধীনে গতিশীল সমাবেশ লোডিংয়ের সাথে আপাতদৃষ্টিতে অবিশ্বাস্য সমস্যাটি সমাধান করতে সহায়তা করেছে। আপনার উত্তর দেওয়া উচিত!
ফিলিপ ড্যানিয়েলস

2
@ জডুভ আপনি কি নিশ্চিত যে assemblyপরিবর্তনশীল "মাইডোমাইন" থেকে সমাবেশটি উল্লেখ করবেন? আমি মনে করি var assembly = value.GetAssembly(args[0]);আপনি আপনার args[0]উভয় ডোমেনে লোড করবেন এবং assemblyভেরিয়েবল মূল অ্যাপ্লিকেশন ডোমেন থেকে রেফারেন্স অনুলিপি করবে
ইগোর বেনড্রপ

14

http://support.microsoft.com/kb/837908/en-us

সি # সংস্করণ:

একটি মডারেটর শ্রেণি তৈরি করুন এবং এর উত্তরাধিকারী MarshalByRefObject:

class ProxyDomain : MarshalByRefObject
{
    public Assembly GetAssembly(string assemblyPath)
    {
        try
        {
            return Assembly.LoadFrom(assemblyPath);
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(ex.Message);
        }
    }
}

ক্লায়েন্ট সাইট থেকে কল

ProxyDomain pd = new ProxyDomain();
Assembly assembly = pd.GetAssembly(assemblyFilePath);

6
এই সমাধানটি কীভাবে একটি নতুন অ্যাপডোমেন তৈরির প্রসঙ্গে রাখা হয়েছে, কেউ ব্যাখ্যা করতে পারেন?
ত্রি কিউ ট্রান

2
MarshalByRefObjectএ্যাপডোমেনগুলির আশেপাশে একটি পাস করা যেতে পারে। সুতরাং আমি অনুমান করব যে Assembly.LoadFromএকটি নতুন অ্যাপডোমিনে অ্যাসেম্বলিটি লোড করার চেষ্টা করে, কেবলমাত্র কী সম্ভব, যদি কলিং অবজেক্টটি সেই অ্যাপডোমাইনগুলির মধ্যে পাস করা যায়। এটিকে এখানে বর্ণিত হিসাবে রিমোটিংও বলা হয়: এমএসডিএন.মাইক্রোসফট
ক্রিস্টোফ মেইনার

32
এটি কাজ করে না। আপনি যদি কোডটি কার্যকর করেন এবং অ্যাপডোমাইন.কন্টেনডোমাইন.গেটসেম্বলিসগুলি () পরীক্ষা করে দেখেন যে আপনি যে টার্গেট অ্যাসেম্বলিটি লোড করার চেষ্টা করছেন সেটি বর্তমান অ্যাপ্লিকেশন ডোমেনে লোড হয়েছে এবং প্রক্সিটি নয়
Jduv

41
এটি সম্পূর্ণ আজেবাজে কথা। আনুষ্ঠানিকভাবে MarshalByRefObjectএটিকে AppDomainএকে অপরকে লোড করে না , এটি যখনই একে AppDomainঅপরের থেকে রেফারেন্সটি মুছে ফেলে AppDomain(সাধারণত CreateInstanceAndUnwrapপদ্ধতিটি পদ্ধতি হিসাবে) তখন সিরিয়ালাইজেশন ব্যবহার করার পরিবর্তে একটি স্বচ্ছ রিমোটিং প্রক্সি তৈরি করতে .NET ফ্রেমওয়ার্কটিকে বলে । বিশ্বাস করা যায় না যে এই উত্তরের 30 টিরও বেশি উর্ধ্বে রয়েছে; কোড এখানে কলিং শুধু একটি pointlessly ঘুরা পথ Assembly.LoadFrom
অ্যারোনআউট

1
হ্যাঁ এটি দেখতে সম্পূর্ণ বোকামির মতো, তবুও এটির 28 টি ভোট রয়েছে এবং এটি উত্তর হিসাবে চিহ্নিত হয়েছে। সরবরাহ করা লিঙ্কটি মার্শালবাইরফঅবজেক্টের কথাও উল্লেখ করে না। বেশ উদ্ভট। যদি এটি আসলে কিছু করে তবে আমি কাউকে কীভাবে পছন্দ করব তা ব্যাখ্যা করতে
মিক

12

একবার আপনি অ্যাসেম্বলি উদাহরণটি কলার ডোমেনে ফেরত দিলে, কলার ডোমেন এটি লোড করার চেষ্টা করবে! এই কারণেই আপনি ব্যতিক্রম পান। আপনার কোডের শেষ লাইনে এটি ঘটে:

domain.Load(AssemblyName.GetAssemblyName(path));

সুতরাং, আপনি সমাবেশের সাথে যা কিছু করতে চান, তা একটি প্রক্সি ক্লাসে করা উচিত - এমন এক ক্লাস যা মার্শালবাইরফঅবজেক্টের উত্তরাধিকারী ।

কলার ডোমেন এবং নতুন তৈরি করা ডোমেন উভয়েরই প্রক্সি শ্রেণির সমাবেশে অ্যাক্সেস থাকা উচিত count যদি আপনার সমস্যাটি খুব জটিল না হয় তবে অ্যাপ্লিকেশন বেস ফোল্ডারটি অপরিবর্তিত রেখে দেওয়ার কথা বিবেচনা করুন, সুতরাং এটি কলার ডোমেন ফোল্ডারের মতো হবে (নতুন ডোমেনটি কেবল এটির প্রয়োজনীয় সমাবেশগুলি লোড করবে)।

সাধারণ কোডে:

public void DoStuffInOtherDomain()
{
    const string assemblyPath = @"[AsmPath]";
    var newDomain = AppDomain.CreateDomain("newDomain");
    var asmLoaderProxy = (ProxyDomain)newDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(ProxyDomain).FullName);

    asmLoaderProxy.GetAssembly(assemblyPath);
}

class ProxyDomain : MarshalByRefObject
{
    public void GetAssembly(string AssemblyPath)
    {
        try
        {
            Assembly.LoadFrom(AssemblyPath);
            //If you want to do anything further to that assembly, you need to do it here.
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(ex.Message, ex);
        }
    }
}

যদি আপনার বর্তমান অ্যাপ্লিকেশন ডোমেন ফোল্ডারের চেয়ে পৃথক কোনও ফোল্ডার থেকে অ্যাসেম্বলিগুলি লোড করার দরকার হয় তবে নির্দিষ্ট ডিএলএস অনুসন্ধানের পথ ফোল্ডার সহ নতুন অ্যাপ্লিকেশন ডোমেন তৈরি করুন।

উদাহরণস্বরূপ, উপরের কোড থেকে অ্যাপ ডোমেন তৈরি লাইনটি এর সাথে প্রতিস্থাপন করা উচিত:

var dllsSearchPath = @"[dlls search path for new app domain]";
AppDomain newDomain = AppDomain.CreateDomain("newDomain", new Evidence(), dllsSearchPath, "", true);

এইভাবে, সমস্ত ঘরগুলি স্বয়ংক্রিয়ভাবে ডলস অনুসন্ধানপথ থেকে সমাধান করা হবে।


প্রক্সি ক্লাস ব্যবহার করে কেন আমাকে সমাবেশটি লোড করতে হবে? এসেম্বলি. লোডফ্রোম (স্ট্রিং) ব্যবহার করে এটি লোডের সাথে তুলনা করে কী পার্থক্য রয়েছে। আমি সিএলআরের দৃষ্টিভঙ্গি থেকে প্রযুক্তিগত বিশদ সম্পর্কে আগ্রহী। আপনি যদি কোনও উত্তর সরবরাহ করতে পারেন তবে আমি খুব কৃতজ্ঞ হব।
ডেনিস ক্যাসেল

নতুন সমাবেশটি আপনার কলার ডোমেনে লোড হওয়া থেকে বাঁচতে আপনি প্রক্সি ক্লাস ব্যবহার করেন। যদি আপনি অ্যাসেম্বলিটি ব্যবহার করেন o লোডফ্রোম (স্ট্রিং), কলার ডোমেন নতুন সমাবেশের রেফারেন্সগুলি লোড করার চেষ্টা করবে এবং সেগুলি খুঁজে পাবে না কারণ এটি "[AsmPath]" এ সমাবেশগুলি অনুসন্ধান করে না। ( এমএসডিএন.মাইক্রোসফটকম /en-us/library/yx7xezcf%28v=vs.110%29.aspx )
নীড়

11

আপনার নতুন AppDomain উপর, একটি সেট করার চেষ্টা AssemblyResolve ইভেন্ট হ্যান্ডলার। নির্ভরতা অনুপস্থিত থাকলে সেই ইভেন্টটি ডাকা হয়।


এটা হয় না। প্রকৃতপক্ষে, আপনি নতুন অ্যাপডোমাইনটিতে এই ইভেন্টটি নিবন্ধভুক্ত করার লাইনে একটি ব্যতিক্রম পাবেন। আপনি এই ইভেন্টটি বর্তমান অ্যাপডোমায়নে নিবন্ধন করতে হবে।
ব্যবহারকারী 1004959

ক্লাসটি মার্শালবাইরফ অফজেক্ট থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হলে তা করে। শ্রেণিটি কেবল [সিরিয়ালাইজযোগ্য] বৈশিষ্ট্যের সাথে চিহ্নিত থাকলে তা হয় না।
ব্যবহারকারী2126375

5

রেফারেন্সড অ্যাসেম্বলিটি জিএসি বা সিএলআর-এর অনুসন্ধানের পথে না থাকলে আপনাকে অ্যাপডোমেন.অ্যাস্পেসারলসলভস বা অ্যাপডোমাইন.সফেসনঅনলাইনঅ্যাস্প্লেশনগুলি পুনরায় ইভেন্টগুলি সমাধান করুন (আপনি যা করছেন তার উপর নির্ভর করে)

AppDomain.AssemblyResolve

AppDomain.ReflectionOnlyAssemblyResolve


সুতরাং আমি ম্যানুয়ালি অনুরোধ সমাবেশটি নির্দেশ করতে হবে? এমনকি এটি নতুন অ্যাপডোমাইনের অ্যাপবেসে রয়েছে? না করার উপায় আছে কি?
আবাতিশ শেভ

5

@ ব্যবহারকারী1996230 এর উত্তর বুঝতে আমার কিছুটা সময় লেগেছে তাই আমি আরও সুস্পষ্ট উদাহরণ দেওয়ার সিদ্ধান্ত নিয়েছি। নীচের উদাহরণে আমি অন্য অ্যাপডোমায়নে লোড হওয়া কোনও সামগ্রীর জন্য একটি প্রক্সি তৈরি করি এবং অন্য ডোমেন থেকে সেই বস্তুর একটি পদ্ধতি কল করি।

class ProxyObject : MarshalByRefObject
{
    private Type _type;
    private Object _object;

    public void InstantiateObject(string AssemblyPath, string typeName, object[] args)
    {
        assembly = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + AssemblyPath); //LoadFrom loads dependent DLLs (assuming they are in the app domain's base directory
        _type = assembly.GetType(typeName);
        _object = Activator.CreateInstance(_type, args); ;
    }

    public void InvokeMethod(string methodName, object[] args)
    {
        var methodinfo = _type.GetMethod(methodName);
        methodinfo.Invoke(_object, args);
    }
}

static void Main(string[] args)
{
    AppDomainSetup setup = new AppDomainSetup();
    setup.ApplicationBase = @"SomePathWithDLLs";
    AppDomain domain = AppDomain.CreateDomain("MyDomain", null, setup);
    ProxyObject proxyObject = (ProxyObject)domain.CreateInstanceFromAndUnwrap(typeof(ProxyObject).Assembly.Location,"ProxyObject");
    proxyObject.InstantiateObject("SomeDLL","SomeType", new object[] { "someArgs});
    proxyObject.InvokeMethod("foo",new object[] { "bar"});
}

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

4

কীটি অ্যাপডোমাইন দ্বারা উত্থাপিত অ্যাসেমব্লিলি রিলভ ইভেন্ট।

[STAThread]
static void Main(string[] args)
{
    fileDialog.ShowDialog();
    string fileName = fileDialog.FileName;
    if (string.IsNullOrEmpty(fileName) == false)
    {
        AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
        if (Directory.Exists(@"c:\Provisioning\") == false)
            Directory.CreateDirectory(@"c:\Provisioning\");

        assemblyDirectory = Path.GetDirectoryName(fileName);
        Assembly loadedAssembly = Assembly.LoadFile(fileName);

        List<Type> assemblyTypes = loadedAssembly.GetTypes().ToList<Type>();

        foreach (var type in assemblyTypes)
        {
            if (type.IsInterface == false)
            {
                StreamWriter jsonFile = File.CreateText(string.Format(@"c:\Provisioning\{0}.json", type.Name));
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                jsonFile.WriteLine(serializer.Serialize(Activator.CreateInstance(type)));
                jsonFile.Close();
            }
        }
    }
}

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    string[] tokens = args.Name.Split(",".ToCharArray());
    System.Diagnostics.Debug.WriteLine("Resolving : " + args.Name);
    return Assembly.LoadFile(Path.Combine(new string[]{assemblyDirectory,tokens[0]+ ".dll"}));
}

0

আমাকে বেশ কয়েকবার এটি করতে হয়েছিল এবং বিভিন্ন বিভিন্ন সমাধান নিয়ে গবেষণা করেছি।

আমি সর্বাধিক মার্জিত এবং সাধন করতে সহজ সমাধানটি এরূপে প্রয়োগ করা যেতে পারে।

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 মিনিটের মধ্যে ডাকা না হয় তবে আপনি ডোমেনটি ধ্বংস করতে চান।

আশা করি এটা কাজে লাগবে.


হাই, আমি যদি সঠিকভাবে মনে রাখি তবে মূল সমস্যাটি ছিল কীভাবে সমস্ত নির্ভরতা পুনরাবৃত্তভাবে লোড করা যায়, তাই প্রশ্ন। দয়া করে আপনার কোডটি হ্যালোওয়ার্ল্ড পরিবর্তন করে এমন ধরণের শ্রেণিতে ফিরে আসুন যাতে প্রকারের Foo, FooAssemblyসম্পত্তি রয়েছে Bar, BarAssembly, অর্থাৎ মোট 3 টি সমাবেশ 3 এটা কি কাজ চালিয়ে যাবে?
abatishchev

হ্যাঁ, সমাবেশের তদন্ত পর্যায়ে গণ্য করা সঠিক ডিরেক্টরি প্রয়োজন। অ্যাপডোমাইনের একটি অ্যাপ্লিকেশনবেস রয়েছে, তবে আমি এটি পরীক্ষা করিনি। এছাড়াও কনফিগার করা ফাইলগুলি যেমন আপনি অ্যাপ্লিকেশন প্রোব ডিরেক্টরিগুলি যেমন একটি app.config নির্দিষ্ট করতে পারেন যা একটি dll ব্যবহার করতে পারে পাশাপাশি বৈশিষ্ট্যগুলিতে অনুলিপি করতে সেট করে। এছাড়াও, পৃথক অ্যাপ্লিকেশন ডোমেনে লোড করতে ইচ্ছুক সমাবেশের বিল্ডিংয়ের উপরে যদি আপনার নিয়ন্ত্রণ থাকে তবে উল্লেখগুলি কোনও হিন্টপথ পেতে পারে যা নির্দিষ্ট করে এটির সন্ধান করা উচিত। যদি সমস্ত ব্যর্থ হয় তবে আমি নতুন অ্যাপডোমাইনস এসেম্বলি রেজলভ ইভেন্টের সদস্যতা নেব এবং ম্যানুয়ালি অ্যাসেম্বলিগুলি লোড করব that এর জন্য উদাহরণস্বরূপ ons
সিম্পার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.