如何在运行时引用DLL?

我正在使用WPF和C#构建应用程序,基本上我想允许任何人创建一个dll并将其放入一个文件夹(类似于插件)。 应用程序将获取文件夹上的所有dll,加载它们并使用它们的方法(在接口上定义)。

有关如何在运行时引用dll的任何想法? 任何更好的想法如何实现这一点?

我实现了类似于你要求通过给定目录中的dll搜索并找到实现特定接口的类的东西。 以下是我以前用过的课程:

public class PlugInFactory { public T CreatePlugin(string path) { foreach (string file in Directory.GetFiles(path, "*.dll")) { foreach (Type assemblyType in Assembly.LoadFrom(file).GetTypes()) { Type interfaceType = assemblyType.GetInterface(typeof(T).FullName); if (interfaceType != null) { return (T)Activator.CreateInstance(assemblyType); } } } return default(T); } } 

您所要做的就是使用以下内容初始化此类:


  PlugInFactory loader = new PlugInFactory(); InterfaceToSearchFor instanceOfInterface = loader.CreatePlugin(AppDomain.CurrentDomain.BaseDirectory); 

如果此答案或任何其他答案可帮助您解决问题,请单击复选标记将其标记为答案。 此外,如果您觉得这是一个很好的解决方案,请表达您的赞赏。 只是想到我会提到它,因为看起来你没有接受任何其他问题的答案。

看看MEF 。 它应该提供你正在寻找的东西。

使用reflection也是一种选择,但如果你问我,MEF将是更好的选择。

我想你可以从类似的东西开始

 Assembly assembly = Assembly.LoadFrom("Something.dll"); Type type = assembly.GetType("SomeType"); object instanceOfSomeType = Activator.CreateInstance(type); 

然后你可以使用它

  string relative = "ClassLibrary1.dll"; string absolute = Path.GetFullPath(relative); Assembly assembly = Assembly.LoadFile(absolute); System.Type assemblytype = assembly.GetType("ClassLibrary1.Class1"); object []argtoppass={1,2}; var a =Activator.CreateInstance(assemblytype, argtoppass); System.Type type = a.GetType(); if (type != null) { string methodName = "add"; MethodInfo methodInfo = type.GetMethod(methodName); object result = methodInfo.Invoke(a, null); int a1 = (int )result; } 

我正在开发类似的东西,其中客户可能安装了不同版本的第三方DLL,但名称和位置相同。 如果我们没有引用正确的版本,我们就会失败。 我使用reflection来识别版本,但我需要修改设置以根据版本使用不同的DAL类,或者通过接口使DAL版本独立。

我倾向于第二个。 如果您在代码中创建一个“虚拟DLL”,它实现了一个接口,该接口具有您想要从目标程序集调用的所有方法,并且不是将实际类型作为参数传递给接口,那么您应该能够使用所有您的设计时代码中的方法和基于您的模型实现进行编译,甚至进行测试,但是当您在运行时加载实际的程序集时,从实际程序集中获取结果。让我知道这是否适合您,我也会告诉你的。

乔伊摩根