C#动态使用DLL函数

C#动态使用DLL函数,c#,file,dll,modularity,C#,File,Dll,Modularity,我有两个文件夹,一个文件夹有文件,另一个文件夹有DLL文件,我不知道DLL文件目录中有哪个或多少DLL(模块化使用)。 在每个DLL文件中都有一个函数,该函数获取FileInfo作为参数。 如何在files目录中的每个文件上运行DLL中的所有函数 例如,其中一个DLL文件: using System; using System.IO; namespace DLLTest { public class DLLTestClass { public bool DLLTe

我有两个文件夹,一个文件夹有文件,另一个文件夹有DLL文件,我不知道DLL文件目录中有哪个或多少DLL(模块化使用)。 在每个DLL文件中都有一个函数,该函数获取FileInfo作为参数。 如何在files目录中的每个文件上运行DLL中的所有函数

例如,其中一个DLL文件:

using System;
using System.IO;
namespace DLLTest
{
    public class DLLTestClass
    {
        public bool DLLTestFunction(FileInfo file)
        {
            return file.Exists;
        }
    }
}
主要内容:


非常感谢。

您必须动态加载程序集,找到其中的函数并调用它。所有步骤都有描述

C#是静态类型语言,因此,如果您想从多个程序集中调用特定函数,第一步是定义一个项目,该项目具有此类函数的接口

您必须使用一个接口创建一个项目(称为模块接口或其他任何项目):

public interface IDllTest
{
    bool DLLTestFunction(FileInfo file);
}
然后,所有Dll项目必须至少有一个实现此接口的类:

public class DLLTestClass : IDllTest
{
    public bool DLLTestFunction(FileInfo file)
    {
        return file.Exists;
    }
}
注意上面的IDllTest的实现(您必须添加对项目ModuleInterface的引用)

最后,在主项目中,必须从目录加载所有程序集:

DirectoryInfo dllsDir = new DirectoryInfo(path_to_dlls_Directory);

foreach(FileInfo file in dllsDir.getFiles())
{
    //Load the assembly
    Assembly assembly = Assembly.LoadFile (file.FullName);

    //Get class which implements the interface IDllTest
    Type modules = assembly.GetTypes ().SingleOrDefault(x => x.GetInterfaces().Contains(typeof(IDllTest)));
    //Instanciate
    IDllTest module = (IDllTest)Activator.CreateInstance (modules);

    //Call DllTestFunction (you have to define anyFileInfo)
    module.DLLTestFunction(anyFileInfo);
}
它可能需要一些调整,因为我没有测试它 然而,我确信这是要遵循的步骤

参考文件(法文):


我希望我的英语可以理解,请随意更正。

尼尔斯提出了一个非常好的解决方案,界面清晰。如果您不想创建接口,或者无法创建接口,则可以迭代所有类型和方法以查找已知签名:

var definedTypes = Assembly.LoadFile("file").DefinedTypes;
foreach(var t in definedTypes)
{
    foreach(var m in t.GetMethods())
    {
        var parameters = m.GetParameters();
        if (parameters.Length ==1 && parameters[0].ParameterType == typeof(FileInfo))
        {
            var instanse = Activator.CreateInstance(t);
            m.Invoke(instanse, new[] { fileInfo });
         }
     }
}

为此,您确实需要所有类都有一个无参数构造函数来实例化它。作为
Invoke
方法的一个参数,您给出了fileInfo对象。

也很有趣:-)
var definedTypes = Assembly.LoadFile("file").DefinedTypes;
foreach(var t in definedTypes)
{
    foreach(var m in t.GetMethods())
    {
        var parameters = m.GetParameters();
        if (parameters.Length ==1 && parameters[0].ParameterType == typeof(FileInfo))
        {
            var instanse = Activator.CreateInstance(t);
            m.Invoke(instanse, new[] { fileInfo });
         }
     }
}