динамически разрешающие типы из сборки, загруженной через Reflection - PullRequest
3 голосов
/ 09 февраля 2012

Рассмотрим следующий код в DLL:

public class ReceivingClass
{
    private Assembly myAssembly;
    private Type typeOfClass;
    public ReceivingClass()
    {
        myAssembly = Assembly.LoadFile(@"E:\VSProjects\TestDynamicLinking\MyLib\bin\Debug\MyLib.dll");
        //Can I use this type somehow to resolve the type in the below method?
        typeOfClass = myAssembly.GetType("ExportedClass");
    }
    public bool ReceiveMethod(ExportedClass classobj)
    {
        return true;
    }
}

Итак, проблема в том, что в ReceiveMethod выше ExportedClass - это класс, который определен в сборке, в которую я динамически загруженКонструктор.Итак, могу ли я как-то разрешить тип ExportedClass так, чтобы мне не приходилось использовать dynamic?

Ответы [ 2 ]

5 голосов
/ 09 февраля 2012

Есть несколько вариантов:

  • Ссылка на фактическую сборку (возможно, в вашем случае это невозможно, так как вы загружаете ее динамически),
  • Используйте общий интерфейс, который реализует тип (только если вы можете редактировать загруженную сборку),
  • или Использовать динамику / отражение

Я бы обычно использовал второй подход. Просто определите интерфейс, который ExportedClass реализует в другой (общей) сборке. Затем вы можете попытаться привести созданный экземпляр к этому интерфейсу. вот так:

ISomeInterface obj = Activator.CreateInstance(typeOfClass) as ISomeInterface;

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

1 голос
/ 09 февраля 2012

Если у вас есть подпись метода в вашем коде, например:

public bool ReceiveMethod(ExportedClass classobj)
    {
        return true;
    }

Это означает, что вы уже ссылаетесь на сборку. Вам не нужно загружать его динамически. Также с отражением вы получите тип. Затем вам нужно создать объект типа.

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

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

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

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