我有一个项目,其中有一个名为plugins/
的目录,其中包含多个DLL。
例如,我的plugins/
目录中有两(2)个DLL:Visual.dll
和Momen.dll
其中每个都是一个类,Visual.dll
将具有类名Visual
,而Momen.dll
将具有类名Momen
。
我需要创建一个循环来循环遍历plugins/
目录中的所有DLL文件;一旦进入该循环,它显然会知道该文件是Visual.dll
或Momen.dll
。首先,它需要包含DLL(就像我将它们添加为我的项目的引用一样),以便我可以使用它们。如果循环在Visual.dll
,我将需要它来创建Visual
类的实例,然后执行一个名为Run()
的方法
我是一名PHP开发人员,对VB.NET来说相对较新,在PHP中我可以做类似的事情,这将创建我的Visual
类的新实例(同时传递一些参数) ),然后执行Run()方法:
$className = "Visual";
$instance = new $className("arg1", "arg2");
$instance->Run();
我感谢任何帮助。 谢谢
答案 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})
如果您要对插件做很多事情,而不仅仅是加载和运行一个方法,那么寻找一个插件框架可能是值得的。