Как создать список <T>из экземпляра класса из DLL, на которую ссылаются вручную? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть приложение ASP.NET MVC.

У меня есть пример класса с именем Example

public class Example
{
    public int Id { get; set; }
    public string Property1{ get; set; }
    public string Property2{ get; set; }
} 

У меня также есть метод тестирования - TestingCallFromSeparateConsoleApp, который выполняет некоторые функции и возвращает список.примеров

public List<Example> TestingCallFromSeparateConsoleApp()
{
    List<Example> exampleList = new List<Example>();

    exampleList.Add(new Example
    {
        Id = 1,
        Property1 = "First",
        Property2 = "First",
    });

    exampleList.Add(new Example
    {
        Id = 2,
        Property1 = "Second",
        Property2 = "Second",
    });

    return exampleList;
}

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

Я могу вызвать метод TestingCallFromSeparateConsoleApp, и он возвращает результат в виде объекта типа.

Я пытаюсь привести результат к его правильному типу списка примеров.

 asm = Assembly.LoadFrom(assemblyFile);
 var smsAppInstance = asm.CreateInstance("EngineeringAssistantMVC.Controllers.TestController", false, BindingFlags.CreateInstance, null, null, null, null);

 var ExampleClass = asm.GetType("EngineeringAssistant.Controllers.Example", true);
 var ec = ExampleClass.GetType();

Это дает подробные сведения о классе примера, но я все еще не могу понять, как на самом деле создать экземпляр и использовать класс типа«Пример»

В моей консоли Как я в основном говорю:

ExampleClass newExampleClass = new ExampleClass();

Итак, я могу сказать:

var result = smsAppInstance.GetType().GetMethod("TestingCallFromSeparateConsoleApp").Invoke(smsAppInstance, argumentsTopass);

Где результат может быть приведен к List<ExampleClass>

РЕДАКТИРОВАТЬ 1

Я вручную загружаю файл dll, я не хочу добавлять его через ссылки.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Нет, на самом деле вы не можете

Создание объекта - это концепция времени выполнения.Объявление переменной является концепцией времени компиляции.Вы можете создать экземпляр объекта, который вы загружаете во время выполнения, но вы не можете объявить его в своем коде, потому что он не известен компилятору во время компиляции.

При этом вы можете объявить некоторые переменныекоторый может содержать ссылку на ваш загруженный вручную экземпляр объекта.Очевидным является object.В вашем случае вы также можете объявить IEnumerable<object>, который должен работать из-за ковариации.Кроме этого, нет никакого типа, известного компилятору, который вы можете написать в своем коде.

Если у вас есть IEnumerable<object>, вы не можете сделать намного больше, чем перебирать его.Вы не сможете получить доступ к любому из свойств или методов ExampleClass обычным способом.Вам придется использовать отражение.

Альтернатива

Распространенный способ справиться с этой ситуацией -

  1. Создать третью сборку, содержащуютолько интерфейс, например IExampleClass.

  2. Сборка, которая реализует ExampleClass, имеет ссылку на эту третью сборку.

  3. ExampleClass объявлен как class ExampleClass : IExampleClass

  4. Консольное приложение также имеет ссылку на эту третью сборку.

  5. В коде для консольного приложения вы теперь можете объявить ссылку на ваши объекты с указателем типа IExampleClass и таким образом получить доступ ко всем свойствам и методам.

Итак ... ваш выбор - отражение или интерфейс.

0 голосов
/ 24 мая 2018
Right click project -> Add -> Reference 

Если это проект в вашем решении, выберите проект или нажмите кнопку обзора и выберите свою DLL.

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

Или, если вы действительно хотите просто, используйте динамический.в качестве альтернативы, вам, к сожалению, придется задуматься полностью.Это ваша миссия, если вы решите принять ее

Проблема в том, что вы не можете привести к Type во время выполнения и использовать его во время компиляции.

Обновление

Причина, по которой я хочу это сделать, заключается в том, что если я ссылаюсь на dll, а затем запускаю консольное приложение через Visual Studio, оно работает нормально, ноесли я запускаю exe приложения консоли, оно выдает необработанное исключение: не удалось загрузить файл или сборку «EngineeringAssistantMVC», поэтому я подумал, что загрузка dll вручную будет работать.

Убедитесь, что ваша битность равнаверно, также убедитесь, что вы ссылались на EngineeringAssistantMVC.dll, а также на любые другие dll, на которые он опирается ..

...