在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一个公开Output
types的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到接口,并将加载的对象转换为该接口。 如果成功,则本地调用该函数。
这是非常简单的东西。