Bagaimana cara mengganti kelas di dll?

Subjeknya cukup kabur karena saya tidak yakin terminologi apa yang benar untuk apa yang saya coba lakukan.

Saya telah mengunduh dll (Saya tidak memiliki kode sumbernya), dan menggunakan alat refleksi, saya menemukan bug dalam implementasi dll. Bugnya mudah diperbaiki. Jadi katakanlah bugnya ada di sini:

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

Apakah ada cara untuk mengimplementasikan A saya sendiri yang akan memperbaiki bug dan menyuntikkannya saat runtime untuk menggantikan A instance lainnya?


person Shmoopy    schedule 25.02.2014    source sumber
comment
Itu sangat tergantung pada apa yang dilakukan bug di dalam kelas. Anda berpotensi mewarisi kelas ini (jika bukan sealed) dan secara paksa menyembunyikan implementasi metode yang memiliki bug.   -  person Simon Whitehead    schedule 25.02.2014
comment
Apakah Anda memiliki akses ke pengembang DLL tersebut? Jika ya, minta dia untuk melakukan perubahan. Sampai saat itu Anda bisa menculik cangkir kopi favoritnya.   -  person danish    schedule 25.02.2014
comment
Duplikat: stackoverflow.com/questions/1518891/   -  person    schedule 04.03.2014


Jawaban (2)


Jika Anda menggunakan .NET 4.0. atau lebih tinggi, lihat di: MethodRental.SwapMethodBody Metode

Cara lain: Injeksi CLR: Pengganti Metode Runtime

person HABJAN    schedule 25.02.2014
comment
Tidak pernah tahu tentang ini. Terima kasih. Apakah ini bukan masalah keamanan? bagaimana jika saya hanya mengganti isi metode Login di beberapa DLL? - person danish; 25.02.2014
comment
@danish Metode ini hanya dapat dipanggil oleh klien yang membuat modul dinamis yang berisi tipe yang isi metodenya sedang ditukar. Ini menyiratkan bahwa tidak ada peningkatan hak istimewa, karena perubahan apa pun hanya terlihat di dalam proses yang sudah Anda kendalikan. - person Jacob Krall; 25.02.2014
comment
Tidak bisakah Anda menghapus pemeriksaan keberadaan file lisensi dengan metode ini? - person Thomas; 26.02.2014
comment
@Thomas Semoga. :) - person flarn2006; 05.07.2015

Cara termudah adalah dengan mewarisi kelas itu dan menulis implementasi Anda sendiri.

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

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

Selanjutnya, gunakan kelas Anda.

Child child = new Child();
child.SomeMethod();
person danish    schedule 25.02.2014
comment
Perhatikan bahwa Anda harus menyebutnya sebagai tipe Anak, bahkan UseThatParentClass(ParentClass ins); -› UseThatParentClass(new Child()); akan memanggil SomeMethod default (yang bermasalah di ParentClass, bukan di kelas Anak Anda) karena begitulah cara kerja kata kunci new - tidak seperti warisan (virtual/override ), ini lebih seperti dua metode memiliki nama yang sama - person Jan 'splite' K.; 25.02.2014