سؤال

لقد قمت بتثبيت ELMAH 1.1 .Net 3.5 x64 في مشروع ASP.NET الخاص بي والآن يظهر لي هذا الخطأ (كلما حاولت رؤية أي صفحة):

لا يمكن تحميل الملف أو التجميع 'system.data.sqlite ، الإصدار = 1.0.61.0 ، الثقافة = محايد ، publickeytoken = db937bc2d44ff139' أو واحدة من تبعياتها.تم إجراء محاولة لتحميل برنامج بتنسيق غير صحيح.

وصف:حدث استثناء غير معقد أثناء تنفيذ طلب الويب الحالي.يرجى مراجعة تتبع المكدس لمزيد من المعلومات حول الخطأ وأين نشأت في الكود.

تفاصيل الاستثناء:System.BadImageFormatException:لا يمكن تحميل الملف أو التجميع 'system.data.sqlite ، الإصدار = 1.0.61.0 ، الثقافة = محايد ، publickeytoken = db937bc2d44ff139' أو واحدة من تبعياتها.تم إجراء محاولة لتحميل برنامج بتنسيق غير صحيح.

المزيد من تفاصيل الخطأ في الأسفل.

النظام الأساسي الخاص بي Active Solution هو "Any CPU" وأنا أعمل على نظام التشغيل x64 Windows 7 على معالج x64 بالطبع.سبب استخدامنا لهذا الإصدار من ELMAH هو أن الإصدار 1.0 .Net 3.5 (x86، وهو النظام الأساسي الوحيد الذي تم تجميعه من أجله) أعطانا نفس الخطأ على خادم Windows x64 الخاص بنا.

لقد حاولت التجميع لـ x86 وx64 وحصلت على نفس الخطأ.لقد حاولت إزالة كافة مخرجات المترجم (bin وobj).أخيرًا، قمت بالإشارة إلى ملف SQLite dll مباشرةً، وهو أمر لم يكن ضروريًا للمشروع للعمل على الخادم وظهر لي خطأ المترجم هذا:

خطأ 1 تحذير كخطأ:إنشاء التجميع - يستهدف التجميع المشار إليه "System.Data.SQLite.dll" معالجًا مختلفًا MyProject

هل هناك أية أفكار عن ماهية المشكلة؟

المزيد من تفاصيل الخطأ:

خطأ المصدر:

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

تتبع المكدس:

[BadImageFormatException:لا يمكن تحميل الملف أو التجميع 'system.data.sqlite ، الإصدار = 1.0.61.0 ، الثقافة = محايد ، publickeytoken = db937bc2d44ff139' أو واحدة من تبعياتها.تم إجراء محاولة لتحميل برنامج بتنسيق غير صحيح.
System.reflection.assembly._nload (اسم ملف Assemblyname ، قاعدة كود سلسلة ، أدلة AssemblySecurity ، Assembly locationhint ، stackcrawlmark & ​​stackmark ، boolean throwonfilenotfound ، boolean forintrospection) +0
System.reflection.assembly.nload (اسم ملف codeBlyname ، قاعدة كود سلسلة ، أدلة AssemblySecurity ، Assembly locationhint ، stackcrawlmark & ​​stackmark ، boolean throwonfilenotfound ، boolean forintrospection) +43
System.Reflection.assembly.internalload (Assemblyname AssemblyRef ، أدلة AssemblySecurity ، StackCrawlmark & ​​Stackmark ، Foolean ForinTrospection) +127 System.Reflection.Assembly.internalload (STRENTBLYSTRING ، ANDREDSBLYSCURITY ، stackcrawnmark & ​​stack ، تحميل (سلسلة assemblystring) +28
system.web.configuration.compilationsection.loadassemblyhelper (سلسلة assemblyname ، Boolean Stardirective) +46

[استثناء أخطاء التكوين:لا يمكن تحميل الملف أو التجميع 'system.data.sqlite ، الإصدار = 1.0.61.0 ، الثقافة = محايد ، publickeytoken = db937bc2d44ff139' أو واحدة من تبعياتها.تم إجراء محاولة لتحميل برنامج بتنسيق غير صحيح.
system.web.configuration.compilationsection.loadassemblyhelper (سلسلة التجميع ، boolean stardirective) +613 system.web.configuration.compilationsectionechection.loadAllassembliesFromAppDomainBindirec
system.web.compilation.buildmanager.getReferAsdAssemblies (Compilationsection Compconfig) +178
system.web.compilation.buildproviderscompiler..ctor (VirtualPath configpath ، oolean supportlocalization ، string outputassemblyname) +54
system.web.compilation.applicationbuildprovider.getGlobalasaxBuildResult (Boolean IsprecompilePapp) +232
system.web.compilation.buildmanager.compileglobalasax () +52 system.web.compilation.buildmanager.ensureToplevilescompiled () +337

[httpException (0x80004005):لا يمكن تحميل الملف أو التجميع 'system.data.sqlite ، الإصدار = 1.0.61.0 ، الثقافة = محايد ، publickeytoken = db937bc2d44ff139' أو واحدة من تبعياتها.تم إجراء محاولة لتحميل برنامج بتنسيق غير صحيح.
system.web.compilation.buildmanager.reporttoplevelcompilationexception () +58 System.Web.compilation.BuildManager.ensuretoplevelfilescompiled () ory ، مضيفات instingenvironmentserers المستضافة parameters) +729

[httpException (0x80004005):لا يمكن تحميل الملف أو التجميع 'system.data.sqlite ، الإصدار = 1.0.61.0 ، الثقافة = محايد ، publickeytoken = db937bc2d44ff139' أو واحدة من تبعياتها.تم إجراء محاولة لتحميل برنامج بتنسيق غير صحيح.
System.Web.httpruntime.firstrequestinit (HTTPContext Context) +8896783
System.Web.httpruntime.ensurefirstrequestinit (HTTPContext Context) +85
system.web.httpruntime.processRequestinternal (httpworkerrequest WR) +259

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

المحلول

System.Data.SQLite.dll هو تجمع مختلط، أي.أنه يحتوي على كل من التعليمات البرمجية المُدارة والتعليمات البرمجية الأصلية.ولذلك معينة System.Data.SQLite.dll هو إما x86 أو x64، ولكن ليس كلاهما أبدًا.

تحديث (مجاملة J.بابلو فرنانديز): Cassini، خادم الويب التطويري الذي يستخدمه Visual Studio عند الضغط على F5 أو النقر فوق الزر "تشغيل" الأخضر، هو x86 فقط مما يعني أنه حتى لو كانت محطة العمل الخاصة بك هي x64، فلن تتمكن إلا من استخدام الإصدار x86 من System. Data.SQLite.dll.

البديل هو عدم استخدام Cassini ولكن IIS7 وهو x64 بشكل صحيح.

نصائح أخرى

تأكد من تعيين "تمكين تطبيقات 32 بت" على "خطأ" لتجمع التطبيقات.

اذهب الى IIS7 Application Pool -> advanced settings and set the 32-bit application to true.

هذا بسيط جدًا إذا كنت لا تستخدم SQLite:

يمكنك حذف ملفات SQLite DLL من مجلدات سلة الحل الخاصة بك، ثم من المجلد الذي تشير إليه ELMAH.أعد الإنشاء، ولن يحاول تطبيقك تحميل ملف DLL هذا الذي لا تستخدمه.

لدي جهاز تطوير 64 بت وخادم بناء 32 بت.لقد استخدمت هذا الرمز قبل تهيئة NHibernate.يعمل بشكل سحري على أي بنية (حسنًا 2 لقد اختبرتهم)

أمل أن هذا يساعد شخصاما.

جويدو

        private static void LoadSQLLiteAssembly()
        {
            Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
            FileInfo fi = new FileInfo(dir.AbsolutePath);           
            string binFile = fi.Directory.FullName + "\\System.Data.SQLite.DLL";
            if (!File.Exists(binFile)) File.Copy(GetAppropriateSQLLiteAssembly(), binFile, false);
        }

        private static string GetAppropriateSQLLiteAssembly()
        {
            string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
            string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
            return GetLibsDir() + "\\NUnit\\System.Data.SQLite.x" + arch + ".DLL";
        }

باعتبارك شخصًا اضطر للتعامل مع عدد لا بأس به من تقارير الأخطاء على Roadkill Wiki مع نفس المشكلة تمامًا، فهذا ما يتعين عليك القيام به:

  • هل تستخدم x64 أو x86؟يأتي Sqlite مزودًا بمكتبات DLL للبنيات المنفصلة - انسخ النسخة الصحيحة إلى مجلد bin الخاص بك، وهناك نوعان من DLLS للموفر الرسمي: System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • إذا لم يكن من الممكن إزعاجك بالبحث عن هذه التجميعات، فقم بتمكين وضع 32 بت لمجمع التطبيقات الخاص بك (وهو حل لأجهزة التطوير فقط عادةً)
  • إذا كنت تستضيف على خادم، فستحتاج إلى Microsoft C++ Runtime القابل لإعادة التوزيع - فهو غير مثبت على Server 2008 R2 افتراضيًا. نسخة x64, نسخة x86

إنه ألم حقيقي في المؤخرة كم عدد الأطواق التي يتعين عليك القفز خلالها عند إعادة توزيع ثنائيات SQLite .NET، وكان الحل الذي قدمته لـ Roadkill في النهاية هو نسخ الثنائيات الصحيحة إلى مجلد ~/bin استنادًا إلى البنية التي تستخدمها .لسوء الحظ، هذا لا يحل مشكلة وقت تشغيل C++.

لقد قمت بحل هذه المشكلة عن طريق تثبيت System.Data.SQLite بامتداد Nuget.يمكن استخدام هذا الملحق لـ Visual Studio 2010 أو أعلى.أولاً عليك تثبيت ملحق Nuget.يمكنك المتابعة هنا:

  • انتقل إلى Visual Studio 2010، القائمة -> الأدوات
  • حدد مدير الامتداد
  • أدخل NuGet في مربع البحث وانقر فوق Online Gallery.في انتظار استرجاع المعلومات...
  • حدد مدير حزم NuGet الذي تم استرداده، وانقر فوق "تنزيل".في انتظار التنزيل…
  • انقر فوق "تثبيت" على Visual Studio Extension Installer NuGet Package Manager.انتظر التثبيت لإكمال.
  • انقر فوق "إغلاق" و"إعادة التشغيل الآن".

ثانيًا، يمكنك الآن تثبيت SQLite:

والآن، يمكنك استخدام System.Data.SQLite.

في هذه الحالة، ترى مجلدين x64 وx86، تحتوي هذه المجلدات على SQLite.Interop.dll.انتقل الآن إلى نوافذ خصائص ملفات dll هذه وقم بتعيين إجراء البناء على المحتوى والنسخ إلى دليل الإخراج هو النسخ دائمًا.

لذا، هذه هي طريقتي.

شكرًا.كيم ثو فام ، مدينة هوشيمينه ، فيتنام.بريد إلكتروني:tho.phamkim@gmail.com

يمكن لتجميع System.Data.SQLite المتعلق بالتحميل اليدوي حل هذه المشكلة.

تم تغيير كود جاتابيا على النحو التالي:

    public static void LoadSQLLiteAssembly()
    {
        Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
        FileInfo fi = new FileInfo(dir.AbsolutePath);
        string appropriateFile = Path.Combine(fi.Directory.FullName, GetAppropriateSQLLiteAssembly());
        Assembly.LoadFrom(appropriateFile);
    }

    private static string GetAppropriateSQLLiteAssembly()
    {
        string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
        string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
        return "System.Data.SQLite.x" + arch + ".DLL";
    }

لقد حصلت على هذا الخطأ عندما تم تحويل خادم Windows الخاص بنا من نظام التشغيل 32 بت إلى 64 بت.تم تعيين التجميع الذي كان يلقي الخطأ على التجميع في وضع x86 (أي وضع 32).لقد قمت بتحويله إلى "أي وحدة معالجة مركزية" وقد أدى ذلك إلى الحيلة.ويمكنك تغيير هذه القيمة عن طريق القيام بما يلي:

انقر بزر الماوس الأيمن على المشروع، انتقل إلى Properties -> Build -> Platform Target -> change to "Any CPU"

في حالتنا لم يعمل لأن خادم الإنتاج الخاص بنا مفقود

حزمة Microsoft Visual C++ 2010 SP1 القابلة لإعادة التوزيع (x86)

لقد قمنا بتثبيته وكل شيء يعمل بشكل جيد.يجب أن يكون تمكين تطبيقات 32 بت مضبوطًا على "صحيح" في تجمع التطبيقات ويجب أن يكون لديك الإصدار x86 من المكتبة

لقد قمت بحل هذه المشكلة، بشكل غريب، عن طريق تثبيت System.Data.SQLite عبر تطبيق Nuget GUI، بدلاً من وحدة تحكم مدير الحزم.

التثبيت عبر وحدة التحكم لا يتضمن التبعيات التي تحتاجها هذه المكتبة للتشغيل.

لقد توصلت إلى حلين سريعين.إما العمل بالنسبة لي.أعتقد أن المشكلة بسبب الأذونات.

1) بدلاً من استخدام ملف Elmah.dll من الدليل net-2.0، استخدمت Elmah.dll من net-1.1 .

2) بدلاً من الاحتفاظ بـ Elmah.dll في دليل سلة المشروع.أقوم بإنشاء دليل dll لوضعه فيه.

هناك طريقة أخرى للتغلب على هذه المشكلة وهي ترقية تطبيقك إلى ELMAH 1.2 بدلاً من 1.1.

System.Data.SQLite لديه الاعتماد على System.Data.SQLite.interop تأكد من أن كلا الحزمتين هما نفس الإصدار وكلاهما x86.

هذا سؤال قديم، لكني جربت كل ما سبق.كنت أعمل بدقة x86 المشروع، لذلك لم يكن هناك مجلدين /x86، /x64.ولكن لسبب ما، System.Data.SQLite كانت نسخة مختلفة ل System.Data.SQLite.interop, ، بمجرد أن قمت بسحب ملفات dll المطابقة، تم حل المشكلة.

هل يمكنك حذف مجلد bin debug وإعادة الترجمة مرة أخرى؟

أو تحقق من مرجع مشروعك إلى System.Data.SQLite, ، وتتبع مكان وجوده، ثم افتح ملف dll في العاكس.إذا لم تتمكن من فتحه، فهذا يعني أن ملف dll تالف، وقد ترغب في العثور على ملف صحيح أو إعادة تثبيت إطار عمل .net.

إذا كنت تستخدم IIS Express كخادم الويب على جهاز التطوير الخاص بك، فسأقوم بالتغيير إلى Local IIS.لقد نجح هذا بالنسبة لي.

هذه مشاركة قديمة، ولكنها قد تساعد بعض الأشخاص الذين يبحثون عن هذا الخطأ في محاولة تعيين "تمكين تطبيقات 32 بت" على True لمجمع التطبيقات.وهذا هو ما حل الخطأ بالنسبة لي.لقد توصلت إلى هذا الحل من خلال قراءة بعض التعليقات على إجابة @ beckelmw.

من المحتمل أنك قمت بتثبيت الحزمة الخاطئة.تريد الحزمة التي تنتجها مايكروسوفت الذي ينفذ نموذج موفر System.Data.Common.

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