Создание объекта, который определен в DLL, на которую у меня нет ссылки - PullRequest
2 голосов
/ 23 июля 2010

У меня есть полный путь к DLL, но не ссылка, где мне нужно создать экземпляр объекта, который реализует интерфейс, который я определил.У меня есть контроль над другой DLL, поэтому я могу делать такие вещи, как вставлять статическую функцию в DLL, которая возвращает нужный мне объект.Я просто не уверен, как вызвать эту функцию, или даже если я подхожу к этому правильно.

Ответы [ 3 ]

2 голосов
/ 23 июля 2010

Вам нужно будет вручную загрузить сборку, а затем использовать отражение, чтобы найти и выполнить интересующий вас метод. Вот статья.

Интересные звонки / заявления в этой статье:

  • Вызов Assembly.Load(), чтобы среда выполнения загрузила сборку в домен приложений (что делает его вызываемым элементом).

  • Поиск Type, содержащихся в сборке

  • Создание MethodInfo и ConstructorInfo объектов, которые являются компонентами отражения, используемыми для вызова метода или создания экземпляра, соответственно

  • Вызов .Invoke() на MethodInfo или ConstructorInfo. Invoke() в сущности говорит Reflection выполнить соответствующий метод.

0 голосов
/ 23 июля 2010

Вот фрагмент кода, который я использую, с выделением специфических для компании материалов.Как только вы загрузили сборку (я не могу вспомнить, если этот код загружает сборку для вас или нет), это сработает.

public static IMyType GetInstanceOfMyType()
{
    var myTypeDescriptor = "My.Fully.NameSpaced.TypeName, My.Assembly.Name, Version=1.0.0.0, Culture=neutral"

    IMyType _instance = null;

    try
    {

    var myType = Type.GetType(myTypeDescriptor, true, true);
    if (inst.GetInterface("IMyType") != null)
    {
        // For a constructor that takes a single parameter, that's a string
        var constructorInfo = myType.GetConstructor(new Type[] { typeof(string) });
        _instance = (IMyType)constructorInfo.Invoke(new object[] { "String to Pass To Constructor" });

    }
    else
    {
        // Type isn't correct, complain here.
    }
    }
    catch (Exception ex)
    {
       // Log any errors here
    }

    return _instance;
}

«Любые ошибки»обычно это одно из:

  • Тип, который вы назвали в myTypeDescriptor, не существует
  • Тип, который вы назвали в myTypeDescriptor, не реализует IMyType
  • Тип, который вы назвали в myTypeDescriptor, не имеет конструктора, который соответствует тому, который вы указали в вызове GetConstructor
  • Конструктор вызвал исключение;если это так, его можно найти в ex.InnerException
0 голосов
/ 23 июля 2010

Вы можете загрузить сборку во время выполнения и использовать System.Activator или отражение для создания экземпляра типа в этой сборке. Если тип, который вы хотите получить, не имеет конструктора по умолчанию, вам нужно будет передать ему правильные параметры. Это может быть непросто, но если типы легко построить (в том же методе), это тоже просто. Если вы вызываете метод, который создает этот тип, он вернет объект в случае успеха. Я подозреваю, что интерфейс, на который вы ссылаетесь, не является строго интерфейсом .Net, а представляет собой набор открытых методов для доступа к типу. Вы можете использовать отражение, чтобы вызвать их также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...