【问题标题】:Load a .DLL file and access methods from class within?加载 .DLL 文件并从类中访问方法?
【发布时间】:2009-07-06 16:03:00
【问题描述】:

我对加载这样的库完全不熟悉,但这是我的立场:

我有一个自制的 DLL 文件,它非常简单,包括类本身和方法。在加载这个库的主程序中,我有:

Assembly testDLL = Assembly.LoadFile("C:\\dll\\test.dll");

从这里开始,我有点卡住了。据我所知,它正在正确加载它,因为当我更改名称时它会给我错误。

我从这里做什么?我究竟如何在其中加载类和方法?

谢谢。

【问题讨论】:

  • 是否有特殊原因需要使用反射来动态加载此 dll?如果没有,请使用Lunchy 的答案。

标签: c# dll


【解决方案1】:

使用Assembly.GetTypes() 获取所有类型的集合,或使用Assembly.GetType(name) 获取特定类型。

然后您可以使用Activator.CreateInstance(type) 使用无参数构造函数创建该类型的实例,或者使用Type.GetConstructors 获取构造函数并调用它们来创建实例。

同样,您可以使用 Type.GetMethods() 等获取方法。

基本上,一旦你有了一个类型,你就可以做很多事情——查看member list 了解更多信息。如果您在尝试执行特定任务时遇到困难(泛型可能很棘手),只需提出一个特定问题,我相信我们将能够提供帮助。

【讨论】:

    【解决方案2】:

    如果你知道类型,这就是你获取类的方法。

    Assembly assembly = Assembly.LoadFrom("C:\\dll\\test.dll");
    
    // Load the object
    string fullTypeName = "MyNamespace.YourType";
    
    YourType myType = assembly.CreateInstance(fullTypeName);
    

    完整的类型名称很重要。由于您没有添加 .dll,因此您无法使用 Using,因为它不在您的项目中。

    如果你想要所有,我只想 Jon Skeet 回答。

    【讨论】:

    • 对不起,如果我从坟墓里挖出你的这个答案。我一直想知道是否可以以相同的方式访问接口。也就是说,如果 dll 包含“MyNamespace.MyInterface”,我该如何获取它?即,在您的示例中,dll 加载程序已知“YourType”。如果不是,但我知道它及其方法的名称,即因为它们记录在某处怎么办?
    • @manu3d 是的,你可以。工作方式相同,只需将您的类型替换为界面即可。
    【解决方案3】:

    如果您想动态加载程序集,然后从其中的类调用方法,则需要执行某种形式的动态调用。

    查看here 了解有关这方面的基本建议。

    唯一缺少的是如何获取类型本身,可以使用以下代码轻松检索:

    foreach (Type t in assemblyToScan.GetTypes())
            {
                if(condition)
                    //do stuff
            }
    

    如果您只是想静态地使用程序集(通过在编译时提供程序集),那么本页上 Launcy 的答案就是您要走的路。

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 2023-03-12
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多