كيف يمكنني تمرير وسيطة إلى البرنامج الإضافي C# الذي يتم تحميله من خلال Assembly.CreateInstance؟

StackOverflow https://stackoverflow.com/questions/134481

سؤال

ما لدي الآن (والذي يقوم بتحميل المكون الإضافي بنجاح) هو هذا:

Assembly myDLL = Assembly.LoadFrom("my.dll");
IMyClass myPluginObject = myDLL.CreateInstance("MyCorp.IMyClass") as IMyClass;

يعمل هذا فقط مع الفصل الذي يحتوي على مُنشئ بدون وسائط.كيف يمكنني تمرير حجة إلى المنشئ؟

هل كانت مفيدة؟

المحلول

انت لا تستطيع.بدلا من ذلك استخدم Activator.CreateInstance كما هو موضح في المثال أدناه (لاحظ أن مساحة اسم العميل موجودة في ملف DLL واحد والمضيف في ملف DLL آخر.يجب العثور على كلاهما في نفس الدليل حتى يعمل الكود.)

ومع ذلك، إذا كنت تريد إنشاء واجهة قابلة للتوصيل حقًا، أقترح عليك استخدام طريقة التهيئة التي تأخذ المعلمات المحددة في واجهتك، بدلاً من الاعتماد على المنشئات.بهذه الطريقة يمكنك فقط مطالبة فئة البرنامج المساعد بتنفيذ الواجهة الخاصة بك، بدلاً من "الأمل" في قبول المعلمات المقبولة في المُنشئ.

using System;
using Host;

namespace Client
{
    public class MyClass : IMyInterface
    {
        public int _id;
        public string _name;

        public MyClass(int id,
            string name)
        {
            _id = id;
            _name = name;
        }

        public string GetOutput()
        {
            return String.Format("{0} - {1}", _id, _name);
        }
    }
}


namespace Host
{
    public interface IMyInterface
    {
        string GetOutput();
    }
}


using System;
using System.Reflection;

namespace Host
{
    internal class Program
    {
        private static void Main()
        {
            //These two would be read in some configuration
            const string dllName = "Client.dll";
            const string className = "Client.MyClass";

            try
            {
                Assembly pluginAssembly = Assembly.LoadFrom(dllName);
                Type classType = pluginAssembly.GetType(className);

                var plugin = (IMyInterface) Activator.CreateInstance(classType,
                                                                     42, "Adams");

                if (plugin == null)
                    throw new ApplicationException("Plugin not correctly configured");

                Console.WriteLine(plugin.GetOutput());
            }
            catch (Exception e)
            {
                Console.Error.WriteLine(e.ToString());
            }
        }
    }
}

نصائح أخرى

يتصل

public object CreateInstance(string typeName, bool ignoreCase, BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture, object[] activationAttributes)

بدلاً من.مستندات MSDN

يحرر:إذا كنت ستقوم بالتصويت ضد هذا، فيرجى تقديم فكرة عن سبب خطأ هذا النهج/أو عدم كونه الطريقة الأفضل.

يمكنك مع Activator.CreateInstance

يأخذ Activator.CreateInstance النوع وأي شيء تريد تمريره إلى مُنشئ الأنواع.

http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx

لا يمكنك أيضًا استخدام Activator.CreateInstance، الذي قد يؤدي أداءً أفضل.انظر أدناه سؤال StackOverflow.

كيفية تمرير وسيطات ctor في Activator.CreateInstance أو استخدام IL؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top