C#在运行时从外部DLL加载继承的类

时间:2019-05-15 17:42:49

标签: c# dll runtime .net-assembly

atm Im只是在“玩” 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中),有什么我能做的吗?
  • 方法调用是否在dll中使用最终重写的方法? (可以,但我不确定)

我真的希望您能为我提供帮助,我在Google上发现的所有内容都是关于在外部dll中的类中运行单个方法(或者我太愚蠢而看不到答案),但是对继承类一无所知。 / p>

谢谢!

1 个答案:

答案 0 :(得分:1)

首先,您定义MyClass的方法不是抽象的,如果您需要将其作为抽象类,则需要添加abstract修饰符关键字,因此请记住,我将像{ {1}}是一个具体的课程

  

最重要:创建实例需要在那做些什么? (构造函数需要传递一个参数)

是的,MyClass的构造函数需要一个参数和精确的整数,因此您需要编写如下内容:

MyClass
  

我如何检查它是否成功(或者更好的是哪些例外   是什么意思?)

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

  

什么(其他)可能会出错(找不到dll,dll不包含   类,dll中的类不会扩展MyClass,MyClassInDll具有   与假设的构造函数不同,MyClass具有不同的方法,   属性,而不是dll中使用的MyClass版本)   我有什么可以做的吗?

您不能拥有两个具有不同方法和属性的MyClass,您只能拥有一个,并且要从两个项目(您的dll和您的主方法)中使用一个。

  

方法调用是否在dll中使用最终重写的方法? (可以   但我不确定)

仅当您将方法标记为虚拟方法时,您才能覆盖方法,但是我认为这个问题是因为您使用的是2个MyClass类,正如我之前所说的那样,这是一个错误。

我希望与此有关,我已经很清楚了,但是如果您需要进一步的帮助,请发表评论。