2016-12-18 5 views
3

У меня есть две папки, одна папка с файлами, а другая - с DLL-файлами. Я не могу знать, какие или сколько DLL-файлов находятся внутри каталога файлов DLL (модульное использование). Внутри каждого DLL-файла есть функция, которая получает параметр FileInfo как параметр. Как я могу запускать все функции в DLL для каждого файла из каталога файлов?C# динамически использует функции DLL

, например, один из DLL-файлов:

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

Главная:

DirectoryInfo filesDir = new DirectoryInfo(path_to_files_Directory); 
DirectoryInfo dllsDir = new DirectoryInfo(path_to_dlls_Directory); 

foreach(FileInfo file in filesDir.getFiles()) 
{ 
    //How do I run each one of the dll funtions on each one of the files? 
} 

Большое спасибо.

ответ

2

C# является статическим языком, поэтому, если вы хотите вызвать определенную функцию из многих сборок, первым шагом будет определение одного проекта с интерфейсом для такой функции.

Вы должны создать один проект (так называемый ModuleInterface или что-нибудь еще) с одним интерфейсом:

public interface IDllTest 
{ 
    bool DLLTestFunction(FileInfo file); 
} 

Тогда все ваши Dll проекты должны иметь по крайней мере один Classe, который реализует этот интерфейс:

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); 
} 

Это, вероятно, потребуются некоторые корректировки, потому что я не протестировать его! Однако я уверен, что это шаги, чтобы следовать.

Reference (на французском языке): http://www.lab.csblo.fr/implementer-un-systeme-de-plugin-framework-net-c/

Я надеюсь, что мой английский понятно, не стесняйтесь исправлять меня.

0

Вам придется загружать сборки, динамически находить в ней функцию и называть ее. Все этапы описаны here

2

Нильс предложил очень хорошее решение с четким интерфейсом. Если вы не хотите, чтобы создать интерфейс, или если вы можите вы можете перебирать все типы и методы, чтобы найти известную подпись:

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.

+0

Интересно также :-) – csblo