Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#在运行时从外部dll加载继承的类_C#_Dll_Runtime_.net Assembly - Fatal编程技术网

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

c#在运行时从外部dll加载继承的类,c#,dll,runtime,.net-assembly,C#,Dll,Runtime,.net Assembly,我正在“玩”一些C#能做的事情——只是想知道它是如何工作的。 现在我有了在运行时从dll加载一个类的想法,该类扩展了我的原始程序中的一个类。例如: // My class in the dll. namespace MyDll { public class MyClassInDll : MyClass { public MyClassInDll(int num) : base(num) { // May contain more code :) }

我正在“玩”一些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的方法和属性与dll中使用的MyClass的版本不同),我能做些什么
  • methodcalls是否在dll中使用最终重写的方法?(应该,但我不确定)
我真的希望你能帮我解决这个问题,我在Google上找到的只是在外部dll中的类中运行一个方法(或者我太笨了,看不到答案),但没有找到任何关于继承类的内容


谢谢大家!

首先,您定义的
MyClass
不是抽象类,如果您需要它是一个抽象类,那么您需要添加抽象修饰符关键字,记住这一点,我将继续回答,就好像
MyClass
是一个具体类一样

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

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

MyClass myclass = new MyClass(1);
我如何检查它是否成功(或更好)哪些异常 意思是什么?)

如果你是说从加载dll,我可以告诉你有一个更好的方法来添加一个dll到你的项目,添加它作为参考

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

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

methodcalls是否在dll中使用最终重写的方法?(应该 但我不确定)

只有将一个方法标记为virtual时才能重写方法,但我认为这个问题是因为您使用的是2个MyClass类,正如我前面所说的,这是一个错误


我希望这一点,我已经足够清楚了,但是如果你需要进一步的帮助,请留下评论。

1)我想动态加载它,因为我想测试一些东西,比如Minecraft的pluginsystem,你只需将.jar放在plugins文件夹中,并将扩展JavaPlugin类的类写入一个文件。在启动时,游戏只是找到jar并在其中加载类。2) 我知道我可以使用MyClass MyClass=新的MyClass(1);但是我想要MyClass myclas=new MyClassInDll(1);:)3) 我的意思是,用于编译dll的MyClass较旧,具有不同的方法或具有不同的参数。是的,我知道我只能重写虚拟方法,但我的意思是,如果我有一个可以重写的方法,该怎么办:)1)然后你应该在try-catch块中加载它,您应该在LoadFile方法的mdsn上查找错误。2) 你应该回顾一下这个关于如何使用反射动态dll的网页,正如我说的,你应该只有一个MyClass,而且它必须在那个地方更新,这样你就不会有这种问题。4) 如果您将一个方法标记为虚拟,并使一个类继承自该类,您将能够重写这些方法。因此,我尝试了一些方法,但它可以工作,但构造函数中没有参数。如何将参数传递给构造函数?我发现了这个:CreateInstance(String、Boolean、BindingFlags、Binder、Object[],CultureInfo、Object[]),但我不知道Binder、BindingFlags或activationAttributes,所以我不知道如何使用这个方法。你能给我一个“正常”使用的例子吗?类似于
CreateInstance(“MyDll.MyClassInDll”,true,?,myArgsAsObjectArray,null,?)?这是我需要做的最后一件事。您可以将null传递给所有这些内容,绑定器和属性绑定器将指定由于使用反射而要如何执行方法搜索,最后一个属性我不确定它是用来做什么的,但是我发现它不应该在新的实现中使用,所以也可以尝试将其置零