Добавить функцию в моем приложении .NET в качестве обработчика событий в другое приложение .NET - PullRequest
2 голосов
/ 31 октября 2009

У нас есть приложение .net, которое мы не разрабатывали, но использовали. Используя рефлектор, я могу сказать, что у этого приложения есть 1) статическая переменная в главной форме формы, которая является ссылкой на эту «основную» форму, и 2) имеет событие, которое вызывается, и я хочу иметь возможность предпринимать действия на его основе.

Я знаю, что бы я делал, если бы это было в моем приложении (mainForm.DefaultInstance.OnAlarm + = myAlarmHandler;) - возможно ли это сделать, даже если это не в моем приложении? Если это помогает, может быть только один экземпляр приложения, с которым я хочу взаимодействовать.

Кроме того, если я могу это сделать, можно ли вызывать другие методы в этом приложении, как если бы это было само приложение, которое их вызывало (особенно кнопка при нажатии на методы) и задавать текст в текстовых полях winform?

Спасибо за любую помощь в этом!

Ответы [ 4 ]

3 голосов
/ 31 октября 2009

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

http://www.postsharp.org/aop-net/runtime-weaving

Приятно то, что во время эксперимента вы не меняете программу на диске, так как все изменения происходят при загрузке сборки.

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

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

Я не пробовал этого, так как мне не нравится ткачество во время выполнения, и я жду PostSharp 2.0, прежде чем я буду гораздо больше экспериментировать с этим инструментом, хотя я широко использовал AspectJ на Java.

1 голос
/ 31 октября 2009
  • Не могу придумать простой способ сделать это. Однако, если бы я попытался, я бы добавил ссылку на это приложение из моего, а затем использовал политику издателя , которая перенаправляет это приложение на мое другое приложение, когда оно выполняется. Затем вы делегируете в первом приложении, но из вашего exe.

  • Другая мысль состоит в том, чтобы ILMERGE двумя exes (или вашей, и дочерней сборкой другого приложения) и написать свой собственный загрузчик IL-модуля, чтобы выполнить ваш код и добавить вашу точку расширения.

В любое время вы можете выполнить в том же месте, что и другой код, тогда у вас, вероятно, есть права на что-либо. Однако, если приложение имеет строковое имя, вам, вероятно, придется решить массу других проблем.

0 голосов
/ 31 октября 2009

Для меня это звучит так, как будто вы хотите внедрить код в другое приложение. Вы можете использовать неуправляемый код (или изрядное количество p / invoke) для внедрения кода в другое приложение с помощью WriteProcessMemory. Вы можете получить хороший пример, взглянув на источник Snoop .

0 голосов
/ 31 октября 2009

Вы можете написать профилировщик для этого приложения, которое находилось снаружи и отправляло уведомление при вызове определенного метода.

Вот действительно хорошая статья о том, как это сделать.Я думаю, что «Получение входных и выходных уведомлений о методах», вероятно, является той частью статьи, которую вы хотите:
http://msdn.microsoft.com/en-us/magazine/cc301725.aspx

Если вы не знакомы с небольшим C ++, есть связанный вопрос поSO, который обращается с использованием профилирующего API с управляемой оболочкой:
.Net Profiling API подходит

...