จะเปลี่ยนคลาสใน 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 (อันที่บั๊กกี้ใน ParentClass ไม่ใช่ที่คลาสย่อยของคุณ) เพราะนั่นคือวิธีการทำงานของคีย์เวิร์ดใหม่ - มันไม่มีอะไรเหมือนกับการสืบทอด (เสมือน / แทนที่ ) เหมือนกับสองวิธีที่มีชื่อเหมือนกัน - person Jan 'splite' K.; 25.02.2014