متى يحمل وقت التشغيل .NET عدد المرجع> 1 لكائنات com؟

StackOverflow https://stackoverflow.com/questions/2567236

  •  24-09-2019
  •  | 
  •  

سؤال

حتى وقت قريب ، اعتقدت أن وقت التشغيل .NET يزيد فقط من العدد المرجعي لكائنات com بمقدار 1 عند إنشاء ملف غلاف قابلين للاستدعاء وقت التشغيل, ، وأنه يتم إنشاء غلاف واحد فقط من وقت التشغيل لأي كائن COM معين.

إذا لم أكن مخطئًا ، فإن ما سبق يعني ذلك Marshal.FinalReleAsecomObject و Marshal.RELEASECOMOBJECT افعل نفس الشيء في الممارسة العملية.

ومع ذلك ، كنت أكتب اليوم بعض الاختبارات للتحقق من أن كائنات COM يتم إصدارها بشكل صحيح بواسطة الكود الخاص بي. أفعل ذلك من خلال استدعاء الكائن المفترض والتحقق من المتوقع InvalidComObjectException. اتضح أن هناك حالات يتم فيها إلقاء الاستثناء بعد أ FinalReleaseComObject, ، ولكن ليس بعد أ ReleaseComObject.

هل هذا يعني أن وقت التشغيل .NET 2.0 يمكن أن يحمل أكثر من إشارة إلى كائن COM؟ إذا كان الأمر كذلك ، متى يفعل هذا؟

هل كانت مفيدة؟

المحلول

هناك مستوى إضافي من عدم التوجيه هنا. نعم ، يحتفظ RCW بتعداد مرجعي واحد على مؤشرات واجهة COM الأصلية. لكن RCW لديه عدد مرجعية أيضًا ، يتم زيادة في كل مرة يتم فيها تعيين مؤشر واجهة COM إلى RCW. والتي قد تحدث إذا قامت طريقة COM بإرجاع مؤشر واجهة. ينقصه النهائي من فئة Wrapper المقابلة.

يمكنك العبث بهذا العدد المرجعي مباشرة من خلال marshal.releasecomobject () ، الذي يقلل من قبل واحد مثل Finalizer ، و marshal.finalreleasecomobject () ، الذي يطلق عليه إلى الصفر ، مما يضمن أن طريقة iunknown :: release () تسمى . إنهم بالطبع يندرجون في فئة "معرفة ما تفعله بشكل أفضل". إن الحصول على خطأ ينتج عنه "كائن كوم" القبيح الذي لا يمكن أن يكون مستثمرًا عن استثناء RCW الأساسي ".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top