Изменить реализацию метода внутреннего класса .NET - PullRequest
3 голосов
/ 06 августа 2009

Я хотел бы изменить способ, которым мое приложение C # / .NET работает внутри. Я покопался в .NET Framework с помощью Reflector и нашел довольно хорошее место, где я мог бы использовать другую реализацию метода. Это внутренний класс в пространстве имен System.Windows.Forms. Вы, очевидно, не можете изменить код этого класса обычными средствами, поэтому я подумал, что можно было бы заменить там метод путем отражения во время выполнения. Метод, который я хотел бы полностью заменить для моего приложения, таков:

public static WindowsFontQuality WindowsFontQualityFromTextRenderingHint(Graphics g)

в классе:

internal sealed class System.Windows.Forms.Internal.WindowsFont

Есть ли способ загрузить этот тип и заменить метод во время выполнения, не затрагивая другие приложения, которые в данный момент выполняются или запускаются впоследствии? Я пытался загрузить тип с помощью Type.GetType() и подобных вещей, но пока не получилось.

Ответы [ 3 ]

8 голосов
/ 06 августа 2009

Вы можете быть в состоянии сделать это с помощью API отладчика - но это действительно очень плохая идея.

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

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

Я бы лично отказался от этого мышления и попытался бы найти другой способ достичь того, что вы пытаетесь сделать.

3 голосов
/ 06 августа 2009
  1. Все, что вы сделаете, чтобы это произошло, было бы неподдерживаемым, ненадежным взломом, который мог сломаться при любом обновлении .NET Framework
  2. Есть еще один, более правильный, способ сделать то, что вы пытаетесь выполнить (и мне не нужно знать, что вы пытаетесь сделать, чтобы знать это наверняка).

Редактирование: Если вас интересует редактирование кода ядра Framework, не стесняйтесь экспериментировать с Mono, но не рассчитывайте распространять ваши модификации, если они зависят от приложения. :)

1 голос
/ 06 августа 2009

Я действительно думаю, что это не очень хорошая идея. Но если вам это действительно нужно, вы можете использовать Mono Cecil и изменять содержимое сборки. Затем вам нужно настроить файл конфигурации для Перенаправление версий сборки .

И, наконец, что не менее важно, ваше продвижение будет считаться незаконным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...