Я тестирую концепцию, у меня есть делегат:
public delegate void PushMessageDelegate(string message);
У меня есть проект dll с методом, который имеет этот тип в качестве обратного вызова:
public void RunReduction(PushMessageDelegate postMessage)
{
try
{
postMessage("Error Message");
postMessage("Warning Message");
postMessage("Info Message");
}catch(Exception ex)
{
Debug.Print(ex.Message);
}
}
У меня естьтестовое консольное приложение, которое использует отражение для загрузки проекта dll.Он также передает метод «PublishMessage» в ссылку на метод.
static void Main(string[] args)
{
Assembly reductionDLL = Assembly.LoadFrom(@"C:\\\...Reduceable.dll");
string[] fullNameStrings = reductionDLL.FullName.Split(new char[] { ',' });
string assemblyName = fullNameStrings[0];
Type reductionClass = reductionDLL.GetType(assemblyName + ".ReductionCode");
object obj = reductionDLL.CreateInstance(reductionClass.FullName);
MethodInfo mi = reductionClass.GetMethod("RunReduction");
mi.Invoke(obj, new object[1]{ (IReduce.PushMessageDelegate)PublishMessage });
Console.ReadLine();
}
private static void PublishMessage(string message)
{
Console.WriteLine(message);
}
Работает, но в mi.Invoke (....) этот код:
postMessage("Error Message");
postMessage("Warning Message");
postMessage("Info Message");
Выполняет первое postMessage («Сообщение об ошибке»), возвращается в PublishMethod и отображает его на консоли.Все хорошо до этого момента, но он не возвращается к RunReduction и не выполняет postMessage («Предупреждающее сообщение»).Кажется, Invoke не то, что мне нужно.Мне нужно что-то, что передает ссылку на RunReduction, я думаю.Я заранее благодарен за помощь.