Метод не найден в загруженной сборке

У меня есть приложение, которое загружает сборку другого приложения и вызывает методы из этой сборки для целей тестирования. Ниже приведен общий пример этого кода.

testAssembly = Assembly.LoadFrom( path );
var classes = testAssembly.GetTypes();
     Type mainForm = classes.Where( c => c.Name == "MainForm" ).SingleOrDefault();
     var form = Activator.CreateInstance( mainForm, null );

     Type secondForm = classes.Where( c => c.Name == "SecondForm" ).SingleOrDefault();
     var sf = Activator.CreateInstance( secondForm , new object[] { form } );

     MethodInfo secondFormMethod = secondForm.GetMethod( "SecondFormMethod" );
     secondFormMethod.Invoke( sf, new object[] { } );

Это работает в точку. Проблема заключается в том, что когда метод запускается, он в конечном итоге приводит к библиотеке, на которую ссылается secondFormMethod, и возвращается с ошибкой "Метод не найден".

Кажется, ни одна из моих ссылок не нарушена ни в одном приложении.

Этот метод работает при запуске из второго приложения, которым я пытаюсь манипулировать.

Не уверен, что я могу делать неправильно.

2 ответа

LoadFrom() загружает только одну сборку, а не сборку и все ее зависимости. Вы должны вызывать его для каждой из сборок (хотя только те, которые находятся в этом стеке вызовов, если вы хотите избежать загрузки всего).

Хорошо, если вы успешно получаете тип для 'secondForm' и 'SecondFormMethod' принадлежит 'secondForm', то вы можете просто получить метод из этого типа. Поскольку мы не знаем, что такое eventList, это было бы возможным быстрым решением:

MethodInfo secondFormMethod = secondForm.GetMethod( "SecondFormMethod" );

Вам также может понадобиться использовать флаги привязки в зависимости от того, где метод фактически определен (т. Е. Унаследован ли он или нет). См. Документацию по флагам привязки здесь: Перечисление флагов привязки

Другие вопросы по тегам