كيفية تشغيل COM الخالي من التسجيل في إمكانية التشغيل المتداخل المُدار / غير المُدار

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

  •  28-10-2019
  •  | 
  •  

سؤال

لدي كائن C ++ / ATL قيد التشغيل غير مُدار (في Unmanaged.dll) أحاول استخدامه من C # DLL مُدار (Managed.dll). ومع ذلك ، أريد استخدام COM المجاني للتسجيل. لقد وصلت إلى هذه الخطوات:

  • تسجيل كائن COM على جهاز التطوير. يجب أن يحتوي الخادم قيد المعالجة على مكتبة نوع مسجلة بشكل صحيح.
  • أضف مرجعًا إلى كائن COM داخل مشروع C # ، ثم اضبط خصائص المرجع على Isolated= True.

ينتج عن ذلك Unmanaged.dll و Managed.dll و Native.Managed.manifest. عند فتح البيان ، من الواضح تمامًا كيف يستخدمه النظام لتحميل كائن COM بطريقة خالية من التسجيل.

ها هي المشكلة. لدي EXE مُدار (Managed.exe) يقوم بتحميل Managed.dll ديناميكيًا للوصول إلى الأنواع العامة. ما أعنيه "ديناميكيًا" هو أنه يستخدم Assembly.LoadFrom ("Managed.dll"). عندما يحاول الرمز الموجود داخل Managed.dll إنشاء كائن COM ، فإنه يحصل على استثناء "فئة غير مسجلة". يبدو أن سياق التنشيط لم يتم إعداده بشكل صحيح عند تحميل Managed.dll.

هل هناك طريقة للحصول على COM المجاني للتسجيل للعمل في هذا السيناريو؟

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

المحلول

يومين بدون إجابة ، هذا ما توصلت إليه في ذلك الوقت ...

يبدو بالفعل أنه تم إعداد سياق التنشيط بواسطة نظام التشغيل عند بدء العملية استنادًا إلى البيان المرتبط بـ EXE الرئيسي. وهذا يعني أن جميع العناصر المتعلقة بـ COM الخالية من التسجيل يجب أن تكون في Main.exe.manifest في وقت بدء العملية. هذا يقطع العزل بين EXE و DLL. إذا كانت DLL مسؤولة عن إنشاء كائنات COM ، فلن تتوقع أن يحتوي ملف EXE الظاهر على معلومات COM الخالية من التسجيل. ربما كنت تتوقع أن يتم دمج البيان المرتبط بـ DLL في سياق تنشيط العملية في الوقت الذي يتم فيه تحميل DLL ، ولكنه لا يتم.

للتغلب على هذا ، يجب على مكتبة الارتباط الحيوي (DLL) تكوين سياق تنشيط جديد قبل إنشاء كائن COM. لجعل الأمور أسوأ ، لا توجد حاليًا (بدءًا من .NET 4.0) طريقة مُدارة للقيام بذلك. لذلك ، سيتعين على DLL PInvoke وظائف Win32 التالية:

لقد أغلقت هذه المكالمات بفئة مُدارة تستدعي CreateActCtx و ActivationActCtx في الباني و DeativateActCtx و ReleaseActCtx في IDisposable :: Dispose.

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