【问题标题】:How to instantiate a class that is declared in a C# DLL?如何实例化在 C# DLL 中声明的类?
【发布时间】:2012-02-23 13:56:27
【问题描述】:

我有一个用 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#,但我有 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) 不能通过实例引用访问;改为使用类型名来限定它。

谢谢大家

【问题讨论】:

  • 你的意思是调用 DivisionClass.Division(x, y) 实际上并没有实例化 DivisionClass,因为它是一个静态方法?
  • 到目前为止您尝试过什么?请注意,您不需要创建实例,因为Division 是一个静态方法。
  • 直接从您的项目参考中调用,例如unloadableDLL.DivisionClass.Division(100,10)。由于它是静态方法,因此您不需要创建实例。
  • 我认为他更大的问题是如何在没有明确项目引用其包含的 dll 的情况下使用静态类。
  • 好的,我没有看到 Divison 是静态的。让我们认为它不是,代码现在是:

标签: c# dll instance


【解决方案1】:

要加载到单独的 AppDomain 并从那里执行方法 - 使用反射,如下面的StackOverflow question。它确实涉及到通常是一个更高级的 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); 

在单独的应用程序域中增加了复杂性 - 请参阅 link

另外,我认为您的 Division 课程不会按原样工作。要跨应用程序域调用,您需要为您的类使用某种序列化或从 MarshalByRefObject 继承类 - 请参阅此SO question。鉴于这看起来像是事物的概念证明类型/您的类的基础实现,那么 MarshalByRefObject 将是您最好的选择 - 我认为最简单。也就是说,跨 AppDomain 执行可能会很麻烦。

通过代码中的实例化调用方法

DivisionClass divisor = new DivisionClass()
divisor.Division(1,2)

【讨论】:

  • 我犯了一个错误。假设“Division”方法不是静态的。
猜你喜欢
  • 2018-03-08
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多