c#在运行时从外部dll加载继承的类
我正在“玩”一些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 :) }
// 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中使用最终重写的方法?(应该,但我不确定)
谢谢大家! 首先,您定义的
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传递给所有这些内容,绑定器和属性绑定器将指定由于使用反射而要如何执行方法搜索,最后一个属性我不确定它是用来做什么的,但是我发现它不应该在新的实现中使用,所以也可以尝试将其置零