在C#中运行时加载DLL

我想弄清楚如何在C#应用程序的运行时导入和使用.dll。 使用Assembly.LoadFile()我已经设法让我的程序加载dll(这部分是肯定工作,因为我能够得到与ToString())类的名称,但是我无法使用'输出'方法从我的控制台应用程序。 我正在编译.dll,然后将其移到我的控制台的项目。 CreateInstance之间有一个额外的步骤,然后才能够使用方法?

这是我的DLL中的类:

namespace DLL { using System; public class Class1 { public void Output(string s) { Console.WriteLine(s); } } } 

这里是我想要加载DLL的应用程序

 namespace ConsoleApplication1 { using System; using System.Reflection; class Program { static void Main(string[] args) { var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll"); foreach(Type type in DLL.GetExportedTypes()) { var c = Activator.CreateInstance(type); c.Output(@"Hello"); } Console.ReadLine(); } } } 

成员必须在编译时可以parsing,直接从C#调用。 否则,您必须使用reflection或dynamic对象。

reflection

 namespace ConsoleApplication1 { using System; using System.Reflection; class Program { static void Main(string[] args) { var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll"); foreach(Type type in DLL.GetExportedTypes()) { var c = Activator.CreateInstance(type); type.InvokeMember("Output", BindingFlags.InvokeMethod, null, c, new object[] {@"Hello"}); } Console.ReadLine(); } } } 

dynamic(.NET 4.0)

 namespace ConsoleApplication1 { using System; using System.Reflection; class Program { static void Main(string[] args) { var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll"); foreach(Type type in DLL.GetExportedTypes()) { dynamic c = Activator.CreateInstance(type); c.Output(@"Hello"); } Console.ReadLine(); } } } 

现在,您正在创build在程序集中定义每种types的实例。 您只需创build一个Class1实例即可调用该方法:

 class Program { static void Main(string[] args) { var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll"); var theType = DLL.GetType("DLL.Class1"); var c = Activator.CreateInstance(theType); var method = theType.GetMethod("Output"); method.Invoke(c, new object[]{@"Hello"}); Console.ReadLine(); } } 

您需要创build一个公开Outputtypes的types的实例:

 static void Main(string[] args) { var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll"); var class1Type = DLL.GetType("DLL.Class1"); //Now you can use reflection or dynamic to call the method. I will show you the dynamic way dynamic c = Activator.CreateInstance(class1Type); c.Output(@"Hello"); Console.ReadLine(); } 

Activator.CreateInstance()返回一个没有Output方法的对象。

看起来你来自dynamic编程语言? C#肯定不是那个,你试图做的将是困难的。

既然你是从一个特定的位置加载一个特定的DLL,也许你只是想添加它作为您的控制台应用程序的参考?

如果你真的想通过Assembly.Load加载程序Assembly.Load ,你必须通过reflection去调用c任何成员

类似于type.GetMethod("Output").Invoke(c, null); 应该这样做。

这并不难。

你可以检查加载对象的可用函数,如果你find了你正在寻找的名字,然后窥探其预期的参数,如果有的话。 如果是您正在尝试查找的调用,则使用MethodInfo对象的Invoke方法调用它。

另一种select是简单地将外部对象构build到接口,并将加载的对象转换为该接口。 如果成功,则本地调用该函数。

这是非常简单的东西。