如何实例化在C#DLL中声明的类
本文关键字:声明 C#DLL 实例化 | 更新日期: 2023-09-27 18:25:29
我有一个用C#编写的DLL。在这个DLL中有一个已定义的类。让我们假设这个DLL的代码是:
namespace unloadableDLL
{
public class DivisionClass
{
public /*static*/ long Division(long x, long y)
{
// We deliberately do not use a try catch to catch divide by 0 exceptions
return (x / y);
}
}
}
现在,我想在测试程序中动态加载这个DLL。我需要看看在以下两种情况下,如果我除以零会发生什么:1) 直接加载DLL(不使用AppDomain)2) DLL不是直接加载的,而是先创建AppDomain,然后加载DLL。
我对C#完全陌生,我的意思是我不到4个小时前就开始了,但我有C++背景。
我的问题是,在我的测试程序中,我需要安装一个DivisionClass对象,但这个对象只在DLL中声明。=>已解决
我的测试程序是
class Program
{
[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
static void Main(string[] args)
{
// Load the DLL
Console.WriteLine("Attempting to load unloadableDLL");
Assembly a = Assembly.LoadFrom("./unloadableDLL.dll");
unloadableDLL.DivisionClass divisionObject = (unloadableDLL.DivisionClass)a.CreateInstance("unloadableDLL.DivisionClass");
long number = divisionObject.Division(8, 2);
Console.WriteLine(number);
}
}
我不知道是什么,但编译器一直告诉我,静态成员unloadableDLL.DivisionClass.Division(lon,long)不能通过实例引用访问;用一个typename来限定它。
感谢所有
要加载到一个单独的AppDomain中,请从那里执行方法-如下面的StackOverflow问题中所述使用反射。它确实是一个更高级的C#主题,但代码是相当样板的,对于一个有C++知识的人来说,它不应该带来问题。
对于直接调用,请遵循上面概述的方法,即引用项目中的dll,并根据Oded(不幸的是,他已经删除了他的答案,因此在下面复制)通过代码实例化
DivisionClass.Division(1, 2)
编辑
如果方法不是静态
通过反射调用方法
Assembly myAssembly1 = Assembly.LoadFrom("myPath''Assembly1.dll");
Type myType = myAssembly1.GetType("MyClass");
object myObject = Activator.CreateInstance(myType);
myType.Invoke("myMethodName", BindingFlags.InvokeMethod, null, myObject, null);
在一个单独的应用程序域中增加了复杂性-请参阅链接。
此外,我不认为你的Division类会按原样工作。要跨应用程序域调用,你需要为你的类使用某种串行化,或者从MarshalByRefObject继承该类-请参阅这个SO问题。假设这看起来像是概念验证类型的东西/类的底层实现,那么MarshalByRefObject将是你的最佳选择——我认为最简单。也就是说,跨AppDomain执行可能会很麻烦。
通过代码中的安装调用方法
DivisionClass divisor = new DivisionClass()
divisor.Division(1,2)