سؤال

أنا على الحصول على System.IO.FileNotFoundException: The specified module could not be found عند تشغيل التعليمات البرمجية C# التي تدعو C++/CLI الجمعية الذي بدوره يدعو النقي ج DLL.يحدث ذلك في أقرب وقت كما هو كائن مثيل أن يدعو النقي ج دالات DLL.

BackingStore هو محض C.CPPDemoViewModel هو C++/CLI الدعوة BackingStore فقد إشارة إلى BackingStore.

حاولت أبسط ممكن الحالة - إضافة جديدة C# اختبار وحدة المشروع الذي يحاول إنشاء كائن محدد في CPPDemoViewModel .لقد تم إضافة إشارة من C# مشروع CPPDemoViewModel .

C++/CLI اختبار المشروع يعمل بشكل جيد فقط مع إضافة الحكم إلى CPPDemoViewModel حتى إنه شيء عن الذهاب بين اللغات.

أنا باستخدام Visual Studio 2008 SP1 مع .Net framework 3.5 المزود بحزمة الخدمة SP1.أنا بناء على ويندوز فيستا x64 ولكن قد حذرا للتأكد من بلدي منصة الهدف هو تعيين إلى x86.

هذا يبدو وكأنه شيء غبي واضح أنا في عداد المفقودين ولكن سيكون أكثر غباء مني أن نضيع الوقت في محاولة حل في القطاع الخاص لذلك أنا هنا محرجة من نفسي!

هذا هو اختبار لمشروع ترقية كمية كبيرة من إرث ج كود أنا الذي حفظ في DLL مع ViewModel تنفيذها في C++/CLI.

تحرير بعد التحقق من الدلائل, أستطيع أن أؤكد أن BackingStore.dll لم يتم نسخها.

لدي مستوى المشروع الفريد من نوعه المجلدات التي تم إنشاؤها مع نموذجية متعددة مشروع حل.

WPFViewModelInCPP
  BackingStore
  CPPViewModel
  CPPViewModelTestInCS
    bin
      Debug
  Debug

أعلى مستوى التصحيح يبدو أن شائعة مجلد المستخدمة من قبل C و C++/CLI المشاريع ، لدهشتي.

WPFViewModelInCPP\Debug يحتوي على BackingStore.dll, CPPDemoViewModel.dll, CPPViewModelTest.dll وما يرتبط بها .وأمثاله،.ملفات pdb

WPFViewModelInCPP\CPPViewModelTestInCS\bin\Debug يحتوي على CPPDemoViewModel و CPPViewModelTestInCS .dll .ملفات pdb ولكن لا BackingStore.ومع ذلك يدويا نسخ BackingStore في هذا الدليل لم يتم إصلاح الخطأ.

CPPDemoViewModel لديه خاصية نسخ المحلية تعيين والذي أعتقد أنه هو المسؤول عن نسخ DLL عندما كان هو المشار إليه.لا أستطيع إضافة مرجع من مشروع C# إلى محض DLL C - هو فقط يقول في إشارة إلى دعم متجر لا يمكن إضافة.

أنا لست متأكدا مما إذا كان لدي مشكلة واحدة فقط أو اثنين.

يمكنني استخدام الطراز القديم نسخ خطوة بناء نسخ BackingStore.dll في أي مشروع C# الدلائل ، على الرغم من أنني آمل الجديدة .نموذج صافي لا تتطلب ذلك.

DependencyWalker يقول لي ان الملف المفقود هو GPSVC.dll التي وقد اقترح يشير إلى إعداد الأمان القضايا.وأظن أن هذا هو ذر الرماد في العيون.

edit2 مع نسخة يدوية من BackingStore.dll أن تكون متاخمة للتنفيذ ، واجهة المستخدم الرسومية الآن يعمل بشكل جيد.C# اختبار المشروع لا يزال لديه مشاكل وأظن بسبب بيئة وقت التشغيل اختبار المشروع ولكن لا يمكن أن يعيش بدون ذلك الآن.

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

المحلول 2

الجواب عن واجهة المستخدم الرسومية الأخرى من تغيير إعدادات الإخراج ، وكان بالإضافة إلى ذلك من قبل-بناء خطوة

copy $(ProjectDir)..\Debug\BackingStore.* $(TargetDir)

الإجابة عن الاختبار المشاريع لإضافة مفقود DLL نشر التبويب testrunconfig.يمكنك إما القيام بذلك مباشرة تحرير الافتراضي LocalTestRun.testrunconfig (يظهر في الحل في إطار الحل العناصر) أو انقر بزر الماوس الأيمن فوق الحل و إضافة الجديد تشغيل اختبار التكوين ، والتي سوف تظهر تحت الاختبار الرئيسي القائمة.

شكرا على الإجابات هذا السؤال على اختبار تكوينات الرائدة مني الجواب.

نصائح أخرى

هي C و C++ Dll في نفس الدليل كما في C# الجمعية أن تنفيذ?

قد تضطر إلى تغيير إعدادات إخراج المشروع الإعدادات بحيث C# الجمعية وغيرها من DLLs جميعا في نهاية المطاف في نفس المجلد.

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

بمجرد تشغيل التطبيق ، قد ترغب أيضا في محاولة للخروج مراقبة عملية على رمز تشغيل ، لمعرفة DLLs التي يتم الرجوع إليها ، حيث أنها تقع.

السبب يحدث هذا لأنك إما يتم تحميل DLLMAIN من التعليمات البرمجية المدارة من قبل CRT فرصة تهيئة.قد لا يكون لديك أي تعليمات برمجية تمت إدارتها يعدم مباشرة أو INDERECTLY من تأثير DllMain الإخطارات.(انظر:الخبراء C++/CLI:.Net Visual C++ المبرمجين الفصل 11++).

أو لديك أي مواطن entrypoint تعريف wahtsoever ، بعد أن كنت قد ترتبط MSVCRT.CLR تلقائيا تهيئة لك مع /clr هذا التفصيل يسبب الكثير من الارتباك و يجب أن تؤخذ بعين الاعتبار.وضع مختلط DLL في الواقع تأخير الأحمال CLR من خلال استخدام الساخنة-الترقيع جميع تمكنت نقطة دخول vtables في الفصول الدراسية.

عدد من صف التهيئة القضايا تحيط هذا الموضوع محمل قفل تأخير التحميل CLR قليلا trickey في بعض الأحيان.في محاولة لاعلان العالمية ثابت وعدم استخدام #pragma المدارة وغير المدارة, عزل التعليمات البرمجية الخاصة بك مع /clr لكل ملف.

إذا كنت لا يمكن عزل رمز من التعليمات البرمجية المدارة ، تواجه مشكلة (بعد أخذ بعض من هذه الخطوات), يمكنك أيضا أن ننظر نحو استضافة CLR نفسك وربما الذهاب من خلال الجهد إنشاء إدارة المجال ، التي من شأنها أن تضمن بشكل كامل "في حلقة" من وقت الأحداث و إلباس الحذاء.

هذا هو exactally السبب ، فقد nothting todo مع مسار البحث ، أو التهيئة.للأسف الانصهار سجل المشاهد لا يساعد كثيرا (وهو المكان المعتاد الذي تبحث عنه .NET CLR الجمعية ملزمة مسائل لا التبعية ووكر).

ربط ثابت لديه شيء ما يجب عمله مع هذا أيضا.يمكنك لا ثابت الرابط C++/CLI التطبيق الذي هو "وضع مختلطة".

  1. ضع DLLMAIN وظيفة في ملف في حد ذاته.
  2. التأكد من أن هذا الملف لا لا لديك /CLR في بناء الخيارات (الملف بناء الخيارات)
  3. تأكد من ربط مع /MD /أو MDd و كل التبعيات الخاصة بك التي يمكنك ربط استخدام نفس CRT.
  4. تقييم رابط إعدادات /DEFAULTLIB و /تشمل تحديد أي العثور الإشارة القضايا ، يمكنك أن تعلن عن النموذج الأولي في التعليمات البرمجية الخاصة بك واستخدامها /تشمل لتجاوز الافتراضي رابط المكتبة القرار.

حظا سعيدا أيضا التحقق من أن الكتاب هو جيد جدا.

هذه هي معضلة مثيرة للاهتمام.كنت قد سمعت أبدا من مشكلة في تحميل الأصلي .DLLs من C++/CLI بعد مكالمة في ذلك من C# من قبل.وأنا يمكن أن نفترض فقط المشكلة هي كما @دانيال L اقترح الخاص بك .DLL ببساطة ليست في مسار الجمعية محمل يمكن أن تجد.

إذا دانيال اقتراح لا يعمل بها, أقترح عليك محاولة ثابت تربط الأم رمز C إلى C++/CLI البرنامج ، إذا كنت تستطيع.ومن المؤكد أن حل المشكلة،.DLL ثم تكون استوعبت تماما في C++/CLI .DLL.

تأكد من النظام الهدف الصحيح MS Visual C runtime, و أن كنت غير قصد بناء dll C مع التصحيح وقت التشغيل.

كان نفس المشكلة التحول إلى 64 بت ويندوز فيستا.طلبنا كان يدعو Win32 Dll التي كانت مربكة الهدف بناء على الطلب.لحل ذلك فعلنا التالية:

  1. انتقل إلى خصائص المشروع;
  2. حدد بناء علامة التبويب ؛
  3. تغيير 'منصة الهدف:' الخيار إلى x86 ،
  4. إعادة بناء التطبيق.

عندما بحثت عن التطبيق يعمل.

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