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




reflection dll (4)

यह इतना मुश्किल नहीं है।

आप लोड ऑब्जेक्ट के उपलब्ध कार्यों का निरीक्षण कर सकते हैं, और यदि आपको वह नाम मिल रहा है जिसे आप नाम से ढूंढ रहे हैं, तो उसके अपेक्षित पैरा, यदि कोई हों तो उसे स्नूप करें। यदि यह वह कॉल है जिसे आप ढूंढने का प्रयास कर रहे हैं, तो इसे MethodInfo ऑब्जेक्ट की Invoke विधि का उपयोग करके कॉल करें।

एक और विकल्प यह है कि बस अपनी बाहरी ऑब्जेक्ट्स को इंटरफ़ेस में बनाना है, और लोड किए गए ऑब्जेक्ट को उस इंटरफ़ेस पर डालना है। यदि सफल हो, तो फ़ंक्शन को मूल रूप से कॉल करें।

यह बहुत आसान सामान है।

मैं यह पता लगाने की कोशिश कर रहा हूं कि सी # एप्लिकेशन के अंदर रनटाइम पर .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();
        }
    }
}

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

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

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

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

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


आपको 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();
     }

अभी, आप असेंबली में परिभाषित हर प्रकार का एक उदाहरण बना रहे हैं। विधि को कॉल करने के लिए आपको केवल 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