如何实例化在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来限定它。

感谢所有

如何实例化在C#DLL中声明的类

要加载到一个单独的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)