سؤال

لدينا تطبيق .NET الذي يتم فيه إنشاء مكون C ++ COM. نقوم بتحميل مكون COM من نافذة نموذج الطفل. يوجد مورد مشترك يتم تحريره بواسطة تطبيق .NET، الذي يتم استخدام Inturn من قبل COM DLL للبدء.

عند إجراء تسلسل الخطوات التالية:
1. إنشاء عنصر تأليف COM في نافذة الطفل الجديد، يتم إنشاء مكون COM، ويستخدمه نموذج الطفل، وبعد استخدامه، يتم تعيينه إلى NULL، على أمل أن يتم تفريغ مكون COM.
2. الحفاظ على نافذة الطفل مفتوحة، ثم تحرير المورد
3. الآن، اذهب و "تحديث" النموذج، لإنشاء مثيل COM جديد، لمعرفة إعادة تشكيل المورد المتغير - ولكن لم يتم تحديث المورد.

كما أننا نستخدم طريقة Marshal.releasecomobject، ولكن دون نجاح. من فضلك النصيحة.

لا يوجد حل صحيح

نصائح أخرى

بمجرد تحميل DLL في AppDomain .NET، فإنه ليس ممسيبا لإجبار DLL على تفريغه. إنه قيود مؤسف من CLR. إذا كنت بحاجة تماما إلى DLL لإلغاء تحميل، فيمكنك القيام بما يلي.

  1. إنشاء AppDomain جديد
  2. قم بتحميل DLL في DLL الجديد
  3. القيام بالعمل في appdomain الجديد
  4. تفريغ AppDomain الجديد

إذا تم تحميل DLL فقط في تطبيق Appdomain واحد، فستحميل تفريغ AppDomain DLL أيضا. لذلك سيحصل هذا على تفريغ DLL. ومع ذلك، إنها إجابة ثقيلة للغاية.

كائن COM DLL هما شيئان مختلفان، حتى لو كان المرء موجودا في مكان آخر. بعض الاختراقات ممكنة، ولكن الحل الأفضل كبير هو إعادة كتابة هذا الجزء بطريقة أكثر عقلانية لا تعتمد على تفريغ DLL.

أ مناقشة حول صفحة clrinterop يصف قريبا جدا مما حددته في سؤالك. لا يقوم جامع القمامة بتفريغ DLL الأصلي. اقتبس: "قد تكون خطرة للغاية على CLR للقيام بذلك لأنه قد يكون هناك رمز آخر (حتى الكود الأصلي) الذي يعتمد على هذا DLL. إذا كنت تأكد من عدم استخدام DLL بعد الآن، استدعاء Windows API مثل Freelibrary كن أسهل طريقة لتفريغ DLL ".

لذلك ستحتاج إلى interop frelibrary واستخدامها لتفريغ DLL الأصلي. على الرغم من أنني قد أضيف: لا يمكنك محاولة العثور على حل حيث لا تحتاج إلى تفريغ DLL.

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