تسجيل COM المجاني دون نسخ dll إلى نفس الدليل مثل الملف القابل للتنفيذ

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

  •  29-10-2019
  •  | 
  •  

سؤال

كيف يمكنني استخدام كائن COM مجاني للتسجيل بدون نسخ ملف dll إلى نفس الدليل مثل الملف القابل للتنفيذ؟ هل هذا ممكن؟

أرغب في الحصول على عينة عمل كاملة أو دليل تفصيلي تفصيلي للسيناريو الدقيق الخاص بي.

على سبيل المثال ، لدي المكونات التالية:
CppTestRunner.exe - تطبيق وحدة التحكم vc ++
CppTests.dll - vc ++ mfc dll
CsCOMServer.dll - c # COM مرئي dll

لا أريد تعديل ملف exe أو دليله ، مثل إضافة بيان خارجي.
CppTests.dll في دليل مختلف عن exe.
لا بأس إذا كان CsCOMServer.dll في نفس الدليل مثل CppTests.dll.

تستدعي CppTestRunner.exe LoadLibrary على CppTests.dll والتي تعمل بشكل جيد.

بعد تضمين البيانات واستخدام واجهات برمجة تطبيقات سياق تنشيط Windows ، تمكنت من نسخ CsCOMServer.dll إلى دليل exe للتحقق من أن CppTests.dll يمكنه إنشاء مثيل لـ CsCOMServer.dll بدون مشاكل ، ولكن مرة أخرى ، أحاول تجنب هذه الخطوة.

حاليًا ، مع CsCOMServer.dll في نفس الدليل مثل CppTests.dll ، وبدون CsCOMServer.dll في دليل exe ، أتلقى الخطأ التالي عند استدعاء CoCreateInstance:
خطأ= 0x80070002 لا يمكن للنظام العثور على الملف المحدد.

لقد استخدمت أداة مراقبة العمليات sysinternals لتعقب المسارات التي يبحث عنها CppTestRunner.exe ، وما إلى ذلك.
لاحظت أنه بناءً على الأشياء التي أحاول القيام بها ، يحاول CppTestRunner.exe أحيانًا قراءة CsCOMServer.dll.config في نفس الدليل مثل CppTests.dll ، ولكن بغض النظر عما أحاول وضعه هناك ، لم أتمكن من الحصول عليه تجاوز الخطأ.
اعتمادًا أيضًا على الأشياء الأخرى التي أحاول القيام بها ، يحاول CppTestRunner.exe قراءة CsCOMServer.dll في نفس الدليل مثل CppTests.dll ولكن لسبب ما ، ما زلت أحصل على نفس الخطأ.

هل يعرف أي شخص برمز العمل بهذا السيناريو بالضبط؟

كما يمكنك أن تقول على الأرجح ، هذا جزء من بعض اختبارات الوحدة \ التكامل.

كحل بسيط ، أقوم حاليًا بنسخ CppTestRunner.exe إلى نفس الدليل مثل CppTests.dll وتشغيله من هناك ، ولكني أرغب في تجنب هذه الخطوة.

شكرًا لك

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

المحلول

.NET تبحث عن COM المجاني من التسجيل المدار أولا في GAC، ثم في مجلد الملف التنفيذي.يستخدم سياق التنشيط لقراءة بيانات التعريف التنشيط، ولكن ليس لتحديد موقع الملفات نفسها.

نصائح أخرى

يمكنك حفظ DLL في مجلد فرعي ، دعنا نقول DLLFolder \ YourDll.dll ، وفي ملف البيان الخاص بـDll ، اكتب اسم الملف مثل Genacodicetagpre

ولكن عليك الاحتفاظ بملف البيان (لمكتبة الارتباط الديناميكي) في الموقع حيث يتم حفظ EXE.

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