Вот рабочий пример использования Reflection для загрузки библиотеки во время выполнения и выполнения метода stati c. Обратите внимание, что он предполагает довольно многое: вы должны заранее знать имя библиотеки, имя класса, имя метода и все его аргументы. Часто намного проще просто сослаться на библиотеку напрямую.
Отличный способ успешно использовать Reflection - вместе с наследованием / интерфейсами. Библиотека A содержит базовый класс или интерфейс, а библиотека B содержит производный класс. Библиотека A может использовать отражение для загрузки библиотеки B, а затем найти все типы классов в библиотеке B , которые являются производными от базового класса или интерфейса (используя Type.IsAssignableFrom ). Таким образом, библиотека A будет иметь строго типизированные свойства и методы для работы, поступающие из базы, вместо того, чтобы знать строковые имена классов, методов и свойств в библиотеке B a priori .
Код для основного EXE, выполняющего отражение:
using System;
using System.IO;
using System.Linq;
using System.Reflection;
namespace SomeNamespace
{
public class Program
{
static void Main()
{
string pathToSampleDLL = "<if you know the path ahead of time, use it>";
// if SampleDLL.dll is in same directory as this EXE (a common occurrence):
string workingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
pathToSampleDLL = Path.Combine(workingDirectory, "SampleDLL.dll");
// load the DLL at runtime
Assembly sampleDLL = Assembly.LoadFrom(pathToSampleDLL);
// since you know the type name, you can use LINQ to return your type:
Type sampleType = sampleDLL.GetTypes().FirstOrDefault(t => t.Name == "Program");
// you are looking for a static method on this type, and you know its name, so use GetMethods:
MethodInfo staticMethod = sampleType.GetMethod("TestMethod", BindingFlags.Public | BindingFlags.Static);
// invoke the method. Since you know its arguments and return value ahead of time, just hard code it:
// you can use null for the object since this is a static method. It takes only one argument, a sample string
staticMethod.Invoke(null, new object[] { "sampleStr" });
}
}
}
Код для библиотеки образцов (скомпилирован в «SampleDLL.dll»):
using System;
namespace SampleDll
{
public class Program
{
public static void TestMethod(string sampleStr)
{
Console.WriteLine("TestMethod Void Runned! Your string is: " + sampleStr);
}
}
}