Ensemble de mode mixte dans .NET 4
-
02-10-2019 - |
Question
J'ai écrit une bibliothèque de classes il y a dans .NET 2.0 pour un accès de base de données quelque 2 ans et ont utilisé tout le long de .NET 2.0, 3.0 et 3.5.
Dans le projet actuel Je travaille sur (ce qui est une application .NET 4.0), essayé d'utiliser l'ancienne bibliothèque de classes fidèle et je suis l'exception suivante:
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:
Qu'est-ce qui pourrait être mal et comment puis-je résoudre ce problème?
La solution
Le mieux serait probablement recompiler votre bibliothèque de classes pour .NET 4.0 dans Visual Studio 2010 (à savoir l'ouverture. Le projet, la conversion, et la modification du cadre cible.)
Si vous ne pouvez pas, ou ne sera pas, faire cela, alors vous pouvez essayer d'ajouter ce qui suit à votre fichier app.config pour votre .NET 4.0 Application:
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
ie.
<?xml version ="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
Autres conseils
Étant donné que votre ensemble est en mode mixte, il peut potentiellement appeler le code managé à partir du code de la machine non gérée dans l'ensemble. Avec le nouveau côte à côté support version CLR en cours dans .NET 4.0, le moteur d'exécution ne sait pas quelle version CLR doit être fournie lorsque cela se produit. Vous devez lui dire que avec un fichier app.exe.config qui devrait ressembler à ceci:
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
Une autre façon: En VB 2010 Express vous pouvez ouvrir votre projet et allez dans l'onglet Compile et Advanced Compile Options...
ensuite. Sélectionnez .NET Framework 2.0
dans la liste déroulante nommée Target framework (all configurations)
.
Si vous n'êtes pas passer à travers, même en spécifiant useLegacyV2RuntimeActivationPolicy = « true », vous devrez peut-être installer une configuration qui est compatible avec votre système d'exploitation et la version .NET. Vous pouvez trouver le même http: // système. data.sqlite.org/index.html/doc/trunk/www/downloads.wiki .
Avant d'installer cette configuration, SQLite désinstaller des programmes installés. Cela montrera des erreurs dans votre code.
Si cela ne fonctionne pas, même après l'installation de la configuration compatible, vous devez supprimer la référence à votre fichier DLL précédente et ajouter une nouvelle référence à ce fichier DLL compatible.
Lorsque vous ajoutez une référence à un fichier DLL compatible il vous suffit de construire votre projet et toutes vos erreurs de code auraient dû.
Vous pouvez essayer d'ouvrir l'ancien projet fidèle (Bibliothèque de classes) à l'intérieur de Visual Studio 2010 et lui permettre de faire la conversion pour vous.
Si quelqu'un d'autre encore rencontré ce problème, voici mon diagnostic: Vous utilisez paquet SQLite faux. Il existe plusieurs versions de SQLite sous http: // système .data.sqlite.org / index.html / doc / trunk / www / downloads.wiki
Par exemple, si vous ciblez .net 4.5 avec x86 platorm vous devez utiliser ce fichier:
sous précompilés statiquement-Linked Binaires pour Windows 32 bits (.NET Framework 4.5)
sqlite-netFx45-static-binary-bundle-Win32-2012-1.0.106.0.zip