c# - सी#में रनटाइम पर डीएलएल लोड हो रहा है




reflection dll (4)

अभी, आप असेंबली में परिभाषित हर प्रकार का एक उदाहरण बना रहे हैं। विधि को कॉल करने के लिए आपको केवल Class1 का एक उदाहरण बनाना होगा:

class Program
{
    static void Main(string[] args)
    {
        var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll");

        var theType = DLL.GetType("DLL.Class1");
        var c = Activator.CreateInstance(theType);
        var method = theType.GetMethod("Output");
        method.Invoke(c, new object[]{@"Hello"});

        Console.ReadLine();
    }
}

मैं यह पता लगाने की कोशिश कर रहा हूं कि सी # एप्लिकेशन के अंदर रनटाइम पर .dll का आयात और उपयोग करने के बारे में आप कैसे जा सकते हैं। विधानसभा का उपयोग करना। लोडफाइल () मैंने अपना प्रोग्राम डीएलएल लोड करने में कामयाब रहा है (यह हिस्सा निश्चित रूप से काम कर रहा है क्योंकि मैं कक्षा के नाम को ToString () के साथ प्राप्त करने में सक्षम हूं), हालांकि मैं 'आउटपुट' का उपयोग करने में असमर्थ हूं। मेरे कंसोल एप्लिकेशन के अंदर से विधि। मैं .dll संकलित कर रहा हूं और फिर इसे अपने कंसोल की परियोजना में ले जा रहा हूं। क्या CreateInstance के बीच एक अतिरिक्त कदम है और फिर विधियों का उपयोग करने में सक्षम है?

यह मेरी डीएलएल में कक्षा है:

namespace DLL
{
    using System;

    public class Class1
    {
        public void Output(string s)
        {
            Console.WriteLine(s);
        }
    }
}

और यहां वह एप्लिकेशन है जिसे मैं डीएलएल लोड करना चाहता हूं

namespace ConsoleApplication1
{
    using System;
    using System.Reflection;

    class Program
    {
        static void Main(string[] args)
        {
            var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll");

            foreach(Type type in DLL.GetExportedTypes())
            {
                var c = Activator.CreateInstance(type);
                c.Output(@"Hello");
            }

            Console.ReadLine();
        }
    }
}

आपको Output विधि का पर्दाफाश करने वाले प्रकार का उदाहरण बनाना होगा:

static void Main(string[] args)
    {
        var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll");

        var class1Type = DLL.GetType("DLL.Class1");

        //Now you can use reflection or dynamic to call the method. I will show you the dynamic way

        dynamic c = Activator.CreateInstance(class1Type);
        c.Output(@"Hello");

        Console.ReadLine();
     }

सदस्यों को सी # से सीधे कॉल करने के लिए संकलित समय पर हल करने योग्य होना चाहिए। अन्यथा आपको प्रतिबिंब या गतिशील वस्तुओं का उपयोग करना होगा।

प्रतिबिंब

namespace ConsoleApplication1
{
    using System;
    using System.Reflection;

    class Program
    {
        static void Main(string[] args)
        {
            var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll");

            foreach(Type type in DLL.GetExportedTypes())
            {
                var c = Activator.CreateInstance(type);
                type.InvokeMember("Output", BindingFlags.InvokeMethod, null, c, new object[] {@"Hello"});
            }

            Console.ReadLine();
        }
    }
}

गतिशील (.NET 4.0)

namespace ConsoleApplication1
{
    using System;
    using System.Reflection;

    class Program
    {
        static void Main(string[] args)
        {
            var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll");

            foreach(Type type in DLL.GetExportedTypes())
            {
                dynamic c = Activator.CreateInstance(type);
                c.Output(@"Hello");
            }

            Console.ReadLine();
        }
    }
}

Activator.CreateInstance() एक ऑब्जेक्ट देता है, जिसमें आउटपुट विधि नहीं है।

ऐसा लगता है कि आप गतिशील प्रोग्रामिंग भाषाओं से आते हैं? सी # निश्चित रूप से नहीं है, और आप जो करने की कोशिश कर रहे हैं वह मुश्किल होगा।

चूंकि आप किसी विशिष्ट स्थान से एक विशिष्ट डीएल लोड कर रहे हैं, हो सकता है कि आप इसे अपने कंसोल एप्लिकेशन के संदर्भ के रूप में जोड़ना चाहें?

यदि आप पूरी तरह विधानसभा के माध्यम से Assembly.Load लोड करना चाहते हैं। लोड, आपको c पर किसी भी सदस्य को कॉल करने के लिए प्रतिबिंब के माध्यम से जाना होगा

type.GetMethod("Output").Invoke(c, null); तरह कुछ। type.GetMethod("Output").Invoke(c, null); यह करना चाहिए





dll