c # загрузить унаследованный класс от внешней библиотеки DLL во время выполнения - PullRequest
1 голос
/ 15 мая 2019

atm Я немного «играю» с тем, что может сделать C # - просто чтобы узнать, как это работает. Теперь у меня появилась идея загрузить класс из библиотеки DLL во время выполнения, которая расширяет класс из моей исходной программы. Пример:

// My class in the dll.
namespace MyDll
{
  public class MyClassInDll : MyClass
  {
    public MyClassInDll(int num) : base(num)
    {
      // May contain more code :)
    }
  }
}

// My abstract class which is inherited in the dll.
namespace MyProgram
{  
  public class MyClass
  {
    private int num;

    public MyClass(int numToUse)
    {
      num = numToUse;
    }

    public void WriteTheNumber()
    {
      Console.WriteLine(num);
    }
  }
}

// My mainfile.
namespace MyProgram
{  
  public class Program
  {
    public void Main(String[] args)
    {
      // Load the DLL
      Assembly dll = Assembly.LoadFile("myDll.dll");

      // Create an instance of MyClassInDll stored as MyClass.
      MyClass myclass = ? // I dont know what to enter here :(

      // Call the function my program knows from MyClass
      myclass.WriteTheNumber(); // this should write the in the constructor passed integer to the console.
    }
  }
}

Итак, вот мои вопросы:

  • Самое главное: что мне нужно сделать там, чтобы создать экземпляр? (Конструктор должен передавать параметр)
  • Как я могу проверить, был ли он успешным (или лучше, какие исключения означают что?)
  • Что (еще) может пойти не так (dll не найдена, dll не содержит класс, класс в dll не расширяет MyClass, MyClassInDll имеет конструктор, отличный от предполагаемого, MyClass имеет методы и атрибуты, отличные от используемой версии MyClass в dll) и есть ли что-нибудь, что я могу сделать?
  • Используют ли methodcall'ы переопределенный в конечном итоге метод в dll? (должен, но я не уверен)

Я действительно надеюсь, что вы можете помочь мне с этим, все, что я нашел в Google, было о запуске одного метода в классе во внешней dll (или я был слишком глуп, чтобы увидеть ответ), но ничего не нашел о унаследованных классах.

Спасибо!

1 Ответ

1 голос
/ 15 мая 2019

Прежде всего то, как вы определили MyClass, не является абстрактным, если вам нужно, чтобы он был абстрактным классом, вам нужно добавить ключевое слово модификатора абстрактного кода, с учетом этого я продолжу ответ, как если бы MyClass это конкретный класс

Самое главное: что мне нужно сделать там, чтобы создать экземпляр? (Конструктор должен передавать параметр)

Да, конструктору MyClass нужен параметр и целочисленное значение, чтобы быть точным, поэтому вам нужно написать что-то вроде этого:

MyClass myclass = new MyClass(1);

Как я могу проверить, был ли он успешным (или лучше, какие исключения что значит?)

Если вы говорите, что загружаете dll, я могу сказать, что есть гораздо лучший способ добавить dll в ваш проект, добавив его в качестве ссылки https://docs.microsoft.com/en-us/visualstudio/ide/managing-references-in-a-project?view=vs-2019

Что (еще) может пойти не так (dll не найдена, dll не содержит класс, класс в dll не расширяет MyClass, MyClassInDll имеет другой конструктор, чем предполагалось, MyClass имеет разные методы и атрибуты, чем версия MyClass, которая использовалась в DLL) и я могу что-нибудь сделать?

У вас не может быть двух MyClass с разными методами и атрибутами, у вас должен быть только один, и вы должны использовать один из обоих проектов (ваш dll и ваш основной метод).

Используют ли methodcall'ы переопределенный метод в dll? (sould но я не уверен)

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

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

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