การเข้าถึงหน่วยความจำที่ได้รับการป้องกันใน C # ผ่าน COM interop

ฉันกำลังสร้าง DLL "ปลั๊กอิน" สำหรับ EXE EXE เรียกใช้ฟังก์ชันใน DLL โดยมี Object เป็นพารามิเตอร์ และไปจากที่นั่น

ทุกอย่างทำงานได้ดีและสวยงามจนกระทั่งฉันแยกมันออกเป็นหัวข้อใหม่ ข้อผิดพลาดนี้เกิดขึ้น

พยายามอ่านหรือเขียนหน่วยความจำที่ได้รับการป้องกัน นี่เป็นข้อบ่งชี้ว่าหน่วยความจำอื่นเสียหาย

เมื่อรันโค้ดนี้บนวัตถุในเธรดใหม่:

    protected object GetPropertyValue(object obj, string PropertyName)
    {
        return obj.GetType().InvokeMember(PropertyName, BindingFlags.GetProperty, null, obj, new object[] { });
    }

ข้างต้นกำลังพยายามเข้าถึงคุณสมบัติบนวัตถุ COM การเปลี่ยนฟังก์ชั่นเป็น 'สาธารณะ' จะไม่ส่งผลกระทบต่อมัน รหัสใช้งานได้ดี แต่ถ้าฉันใช้เพียงเธรดเดียว

สิ่งที่เกิดขึ้นชัดเจน: เธรดใหม่ไม่สามารถเข้าถึงตัวแปรใน EXE ฉันจะแก้ไขปัญหานี้ได้อย่างไร? การไม่ใช้เธรดไม่ใช่ตัวเลือกที่ใช้การได้

ขอบคุณสำหรับความช่วยเหลือใด ๆ


person Lynxy    schedule 25.11.2009    source แหล่งที่มา


คำตอบ (1)


วัตถุ COM ของคุณอาจมีอยู่ใน STA นั่นหมายความว่าคุณต้องส่งกลับไปยังเธรดที่เป็นเจ้าของอ็อบเจ็กต์ และทำการโทรจากที่นั่น

หากวัตถุ COM รองรับเธรดอิสระ ดังนั้นอาจทำงานใน STA เนื่องจากวิธีการหลักของคุณถูกทำเครื่องหมายด้วยแอตทริบิวต์เธรด STA

หรืออีกทางหนึ่ง หากคุณควบคุมวัตถุ COM คุณสามารถลองทำให้เป็นวัตถุ MTA ได้

ในกรณีดังกล่าว ให้ลองลบแอตทริบิวต์นั้นออก อย่างไรก็ตาม หากคุณใช้แบบฟอร์ม Windows จะต้องสร้างแบบฟอร์มจากเธรด STA

person Scott Wisniewski    schedule 25.11.2009
comment
ฉันไม่สามารถควบคุมวัตถุ COM ได้ - person Lynxy; 26.11.2009
comment
แต่คุณสามารถควบคุมเธรดที่เรียกใช้ได้ หากเป็นวัตถุ STA com คุณต้องเข้าถึงจากเธรดที่เป็นเจ้าของ (เธรดที่วัตถุถูกสร้างขึ้น) - person Scott Wisniewski; 27.11.2009
comment
หรือลองเพิ่มการตั้งค่าเธรด BG เพื่อใช้ STA เมื่อคุณสร้างขึ้น หากคุณทำเช่นนั้นฉันเชื่อว่า CLR จะจัดการการส่งเธรดให้คุณ (โดยใช้ลูปข้อความ) เพื่อสิ่งนั้นเพียงแค่เรียก thread.SetAppartmemtState - person Scott Wisniewski; 27.11.2009
comment
ขอบคุณที่ทำเคล็ดลับ! ฉันสร้างพร็อกซีเธรดดั้งเดิมขึ้นมาแล้ว - person Lynxy; 27.11.2009