VB.NET自动在特定文件夹中包含DLL

时间:2014-07-18 17:28:51

标签: vb.net

我有一个项目,其中有一个名为plugins/的目录,其中包含多个DLL。

例如,我的plugins/目录中有两(2)个DLL:Visual.dllMomen.dll

其中每个都是一个类,Visual.dll将具有类名Visual,而Momen.dll将具有类名Momen

我需要创建一个循环来循环遍历plugins/目录中的所有DLL文件;一旦进入该循环,它显然会知道该文件是Visual.dllMomen.dll。首先,它需要包含DLL(就像我将它们添加为我的项目的引用一样),以便我可以使用它们。如果循环在Visual.dll,我将需要它来创建Visual类的实例,然后执行一个名为Run()的方法

我是一名PHP开发人员,对VB.NET来说相对较新,在PHP中我可以做类似的事情,这将创建我的Visual类的新实例(同时传递一些参数) ),然后执行Run()方法:

$className = "Visual";
$instance = new $className("arg1", "arg2");
$instance->Run();

我感谢任何帮助。 谢谢

1 个答案:

答案 0 :(得分:1)

如果DLL是.NET程序集,则可以使用Assembly.LoadFile加载它们。这将为您提供对Assembly对象的引用。

您可以使用程序集的GetExportedTypes方法查看程序集中的公共类型,或使用字符串参数的GetType重载来根据程序集的名称从程序集中获取类型。

从那里,您应该能够使用Activator.CreateInstance的适当重载来创建类的实例。从那里,您还应该能够通过反射找到并运行其Run方法。

编辑这是未经测试的,但这样的事情可能会起作用(或接近工作):

    Dim plugin As Assembly = Assembly.LoadFile("test.dll")
    Dim pluginType As Type = plugin.GetType("Test")

    Dim instance As Object = Activator.CreateInstance(pluginType)
    Dim runMethod As MethodInfo = pluginType.GetMethod("Run")
    Dim param1 As String = "Hello"
    Dim param2 As String = "World"
    runMethod.Invoke(instance, New Object() {param1, param2})

如果您要对插件做很多事情,而不仅仅是加载和运行一个方法,那么寻找一个插件框架可能是值得的。