c# 在运行时从外部 dll 加载继承 class

c# load inherited class from external dll in runtime

atm 我 "playing" 稍微了解了 C# 可以做的事情 - 只是想知道它是如何工作的。 现在我有了在运行时从扩展 class 从我的原始程序扩展 class 的 dll 加载 class 的想法。示例:

// 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.
    }
  }
}

所以这是我的问题:

我真的希望你能帮我解决这个问题,我在 Google 上找到的只是关于 运行 外部 dll 中 class 中的一个方法(或者我也是愚蠢地看到答案)但没有发现任何关于继承的 classes.

谢谢!

首先你定义的方式 MyClass 不是抽象的,如果你需要它是一个抽象的 class 那么你需要添加 abstract 修饰符关键字,考虑到这一点我会继续回答,就好像 MyClass 是一个具体的 class

Most important: what do I need to do there to create an instance? (The constructor needs a parameter to be passed)

是的,MyClass 的构造函数需要一个参数,准确地说是整数,所以你需要这样写:

MyClass myclass = new MyClass(1);

How can I check if it was successfull (or better which exceptions means what?)

如果你是说加载dll,我可以告诉你有更好的方法将dll添加到你的项目中,添加它作为参考https://docs.microsoft.com/en-us/visualstudio/ide/managing-references-in-a-project?view=vs-2019

What (else) could go wrong (dll not found, dll doesnt contain the class, class in dll doesnt extend MyClass, MyClassInDll has a different constructor than assumed, MyClass has different methods and attributes than version of the MyClass that was used in the dll) and is there anyting I can do?

你不能有两个具有不同方法和属性的 MyClass 你应该只有一个并从两个项目(你的 dll 和你的主要方法)中使用那个。

Do methodcalls use a eventually overriden method in the dll? (sould but Im not sure)

如果将方法标记为虚拟方法,则只能重写方法,但我认为这个问题是因为您使用了 2 个 MyClass classes,正如我之前所说,这是一个错误。

我希望我已经足够清楚了,但如果您需要进一步的帮助,请发表评论。