어셈블리를 통해로드되는 C# 플러그인에 인수를 전달하려면 어떻게해야합니까?

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

문제

내가 지금 가지고있는 것 (플러그인을 성공적으로로드)은 다음과 같습니다.

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

이것은 인수가없는 생성자가있는 클래스에만 적용됩니다. 생성자에게 인수를 어떻게 전달합니까?

도움이 되었습니까?

해결책

당신은 할 수 없습니다. 대신 사용하십시오 Activator.CreateInstance 아래 예제와 같이 (클라이언트 네임 스페이스는 하나의 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

또한 활성화기를 사용할 수 없습니다. 아래 stackoverflow 질문을 참조하십시오.

CTOR ARGS를 Activator.CreateInstance 또는 IL을 사용하는 방법은 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top