سؤال

كتبت مكتبة الفصل في .NET 2.0 للوصول إلى قاعدة البيانات منذ حوالي عامين وكنت أستخدمها طوال الوقت .NET 2.0 و 3.0 و 3.5.

في المشروع الحالي الذي أعمل عليه (وهو تطبيق .NET 4.0) ، حاولت استخدام مكتبة فئة المؤمنين القديمة وحصلت على الاستثناء التالي:


System.InvalidOperationException was unhandled
  Message=An error occurred creating the form. See Exception.InnerException for details.
    The error is: Mixed mode assembly is built against version 'v2.0.50727' of the runtime
    and cannot be loaded in the 4.0 runtime without additional configuration information.
    Source=SchoolManager
  StackTrace:
       at SchoolManager.My.MyProject.MyForms.Create__Instance__[T](T Instance) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 190
       at SchoolManager.My.MyProject.MyForms.get_frmGeneric()
       at SchoolManager.My.MyApplication.OnCreateMainForm() in D:\Alex\Documents\Visual Studio 2008\Projects\School Manager\SchoolManager\My Project\Application.Designer.vb:line 35
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       at SchoolManager.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.IO.FileLoadException
       Message=Mixed mode assembly is built against version 'v2.0.50727' of 
           the runtime and cannot be loaded in the 4.0 runtime without additional
           configuration information.
       Source=Dinofage.Data.XpressData
       StackTrace:
            at Dinofage.Data.XpressData.ExecuteSelectInternal(String selectCommand)
            at Dinofage.Data.XpressData.ExecuteSelect(String selectCommand)
            at SchoolManager.Academics.GetNewAdmissionCode(String academicYear) in D:\Alex\Documents\Visual Studio 2008\Projects\School Manager\SchoolManager\Modules\Academics.vb:line 89
            at SchoolManager.StudentDetail..ctor() in D:\Alex\Documents\Visual Studio 2008\Projects\School Manager\SchoolManager\UserControls\StudentDetail.vb:line 20
            at SchoolManager.frmGeneric.InitializeComponent() in D:\Alex\Documents\Visual Studio 2008\Projects\School Manager\SchoolManager\frmGeneric.Designer.vb:line 25
            at SchoolManager.frmGeneric..ctor()
       InnerException: 

ما الذي يمكن أن يكون الخطأ وكيف يمكنني إصلاحه؟

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

المحلول

من المحتمل أن يكون الأفضل هو إعادة ترجمة مكتبة الفصل الخاصة بك لـ .NET 4.0 في Visual Studio 2010 (أي فتح المشروع وتحويله وتغيير الإطار المستهدف.)

إذا لم تتمكن ، أو لا تفعل ذلك ، يمكنك محاولة إضافة ما يلي إلى ملف app.config لتطبيق .NET 4.0 الخاص بك:

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
</startup>

بمعنى آخر.

<?xml version ="1.0"?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0"/>
    </startup>
</configuration>

نصائح أخرى

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

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

طريقة أخرى: في VB 2010 Express يمكنك فتح مشروعك والانتقال إلى علامة التبويب ثم Advanced Compile Options.... يختار .NET Framework 2.0 من القائمة المنسدلة المسمى Target framework (all configurations).

إذا كنت لا تمر حتى عن طريق تحديد uselegacyv2runtimeactivationpolicy = "true" ، فقد تحتاج إلى تثبيت إعداد متوافق مع إصدار نظام التشغيل الخاص بك و .NET. يمكنك أن تجد نفس الشيء في http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki.

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

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

عند إضافة مرجع إلى ملف DLL متوافق ، عليك فقط إنشاء مشروعك ويجب أن تكون جميع أخطاء التعليمات البرمجية قد انتهت.

يمكنك محاولة فتح مشروع المؤمنين القديم (مكتبة الفصل) داخل Visual Studio 2010 والسماح له بالقيام بالتحويل لك.

إذا كان أي شخص آخر لا يزال يواجه هذه المشكلة ، فإليك تشخيصي: أنت تستخدم حزمة SQLite الخاطئة. هناك العديد من إصدارات SQLite تحت http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

على سبيل المثال ، إذا كنت تستهدف .NET 4.5 مع X86 Platorm ، فيجب عليك استخدام هذا الملف:

تحت ثنائيات مرتبطة بشكل ثابت بنظام Windows 32 بت (.NET Framework 4.5)

SQLITE-NETFX45-Static-Binary-Bundle-Win32-2012-1.0.106.0.zip

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