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.
}
}
}
所以这是我的问题:
- 最重要的是:创建实例需要做什么? (构造函数需要传递一个参数)
- 我如何检查它是否成功(或者更好的是哪些异常意味着什么?)
- (其他)可能出错的地方(未找到 dll,dll 不包含 class,dll 中的 class 不扩展 MyClass,MyClassInDll 的构造函数与假定的不同,MyClass 具有不同的方法和属性比 dll 中使用的 MyClass 版本),我能做些什么吗?
- 方法调用是否在 dll 中使用最终覆盖的方法? (应该,但我不确定)
我真的希望你能帮我解决这个问题,我在 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,正如我之前所说,这是一个错误。
我希望我已经足够清楚了,但如果您需要进一步的帮助,请发表评论。
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.
}
}
}
所以这是我的问题:
- 最重要的是:创建实例需要做什么? (构造函数需要传递一个参数)
- 我如何检查它是否成功(或者更好的是哪些异常意味着什么?)
- (其他)可能出错的地方(未找到 dll,dll 不包含 class,dll 中的 class 不扩展 MyClass,MyClassInDll 的构造函数与假定的不同,MyClass 具有不同的方法和属性比 dll 中使用的 MyClass 版本),我能做些什么吗?
- 方法调用是否在 dll 中使用最终覆盖的方法? (应该,但我不确定)
我真的希望你能帮我解决这个问题,我在 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,正如我之前所说,这是一个错误。
我希望我已经足够清楚了,但如果您需要进一步的帮助,请发表评论。