Как заменить класс в dll?

Тема довольно расплывчата, так как я не уверен, что это правильная терминология для того, что я пытаюсь сделать.

Я скачал dll (у меня нет исходного кода) и с помощью инструмента отражения нашел ошибку в реализации dll. Баг легко исправить. Итак, скажем, ошибка здесь:

class A 
{
    void f() { // BUG!!! }
}

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


person Shmoopy    schedule 25.02.2014    source источник
comment
Это действительно зависит от того, что ошибка делает в классе. Вы потенциально можете наследовать от этого класса (если это не sealed) и принудительно скрыть реализацию метода, в которой есть ошибка.   -  person Simon Whitehead    schedule 25.02.2014
comment
У вас есть доступ к разработчику указанной DLL? Если да, попросите его внести изменения. А пока ты можешь похитить его любимую кофейную кружку.   -  person danish    schedule 25.02.2014
comment
Дубликат: stackoverflow.com/questions/1518891/   -  person    schedule 04.03.2014


Ответы (2)


Если вы используете .NET 4.0. или выше, взгляните на: МетодMethodRental.SwapMethodBody

Другой способ: Внедрение CLR: заменитель метода времени выполнения

person HABJAN    schedule 25.02.2014
comment
Никогда об этом не знал. Спасибо. Разве это не проблема безопасности? что, если я просто заменю тело метода входа в какую-нибудь DLL? - person danish; 25.02.2014
comment
@danish Этот метод может быть вызван только клиентом, создавшим динамический модуль, содержащий тип, тело метода которого заменяется. Это подразумевает отсутствие повышения привилегий, поскольку любые изменения видны только внутри процессов, которыми вы уже управляете. - person Jacob Krall; 25.02.2014
comment
Нельзя ли убрать проверку наличия файла лицензии этим методом? - person Thomas; 26.02.2014
comment
@ Томас Надеюсь. :) - person flarn2006; 05.07.2015

Самый простой способ - наследовать от этого класса и написать свою собственную реализацию.

  class ParentClass
            {
                public void SomeMethod() { 
                   //bug here 
                }
            }

            class Child:ParentClass
            {
                new public void SomeMethod() { 
                   // I fixed it 
                }
            }

После этого используйте свой класс.

Child child = new Child();
child.SomeMethod();
person danish    schedule 25.02.2014
comment
Обратите внимание, что вы должны называть его как дочерний тип, даже UseThatParentClass(ParentClass ins); -> UseThatParentClass(new Child()); будет вызывать SomeMethod по умолчанию (тот глючный в родительском классе, а не в вашем дочернем классе), потому что именно так работает новое ключевое слово - это не похоже на наследование (виртуальное/переопределение ), это больше похоже на то, что два метода имеют одно и то же имя - person Jan 'splite' K.; 25.02.2014