2010-12-08 4 views
4

J'ai un projet Windows Form construit en .NET 4.0. Et il se réfère à une DLL System.Data.SQLite qui est intégrée dans .NET 2.0. Lorsque mon fichier exe est déployé sur mon client qui installe uniquement .NET Framework 4.0 sur sa machine (Windows XP), l'exe se bloque..NET Framework 4.0 avec des assemblys utilisant 2.0

Comment puis-je forcer l'EXE à charger la DLL référencée dans CLR 4.0 (bien qu'il soit construit pour utiliser CLR 2.0) afin que sans .NET Framework 2.0 installé, il peut encore s'exécuter?

+2

Quelle exception obtenez-vous? Votre code devrait fonctionner correctement. – SLaks

Répondre

0

Set .Net 4 pour être le profil complet, voir ici msdn.microsoft.com/en-us/library/cc656912.aspx

Cliquez droit sur Projet> Proeprties> Compiler onglet> Options avancées de compilation> Cadre cible . Assurez-vous qu'il ne soit pas réglé sur le client .Net> mis à juste .Net 4 (Full)

Edit: .NET Framework est rétrocompatible en général et vous pouvez configurer Runtimes pris en charge, voir ici http://social.msdn.microsoft.com/forums/en-US/clr/thread/de5956f6-7a12-45d8-ae03-988ad8434a17

En ce qui concerne le crash de EXE, je suppose qu'il s'agit d'une exception de seconde chance (c'est-à-dire que le débogueur ne peut gérer), vous pouvez donc utiliser un vidage de mémoire et utiliser WinDBG pour analyser la mémoire et trouver la cause exacte, sauf bien sûr, le message d'exception de deuxième chance répertorie le System.Data.SQLite en tant que DLL de problème.

+0

Cela ne va pas aider. – SLaks

+0

Comment le savez-vous? Quoi qu'il en soit, j'ai modifié pour inclure les trucs WinDBG :) –

+1

Les profils Client et Full ne peuvent pas provoquer d'exception. – SLaks

4

Définissez useLegacyV2RuntimeActivationPolicy sur true dans votre app.config (more info).

J'ai plus d'informations concernant SQLite sur .NET 4 (en particulier avec EF4) on my blog.

+0

Nice info, je pensais que SQLite est du code managé pur. Espère que cela peut résoudre mes problèmes de client. Je vais leur demander de l'essayer. –

1

John

J'ai eu des problèmes avec la configuration SQLite aussi, que j'utilise avec NHibernate par opposition à EntityFramework (je pense la dernière version aurait pu envisager EF plus, pas sûr). Voici ce qui fonctionne actuellement pour moi.

1) modifier app.config comme le dit Stephen, mais aussi ajouter une directive d'exécution pour la raison dans les commentaires ci-dessous.

2) associez votre plate-forme cible de construction à la DLL qui convient le mieux à vos besoins. 64x ou 86x fonctionneront, mais AnyCpu obtient une sorte d'exception manifeste. J'utilise à contrecoeur x86 car il est plus sûr et n'affecte pas sensiblement tout ce que je fais avec.

Vous pourriez même trouver utile à un moment donné de faire des projets séparés pour isoler les problèmes de dépendance dans la dernière version (je pense que c'était en avril). Ne vous attendez pas non plus à faire beaucoup avec les vues WPF via Visual Studio, car le concepteur XAML ne sera pas content. C'est rapide et doux une fois que vous l'obtenez mais la dernière version n'est pas un brainer.

HTH,
Berryl

ajouts complet de configuration app

<!-- SQLite requires this mixed mode load setting--> 
<startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup> 

<runtime> 
    <loadFromRemoteSources enabled="true"/> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 

    <!-- SQLite is built with older System.Data so we need this redirect -->  
    <dependentAssembly> 
     <assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089"/> 
     <bindingRedirect oldVersion="2.0.0.0" newVersion="4.0.0.0"/> 
    </dependentAssembly> 

    </assemblyBinding> 
</runtime> 
+0

Mettez tout à l'intérieur de ..., pour reconnaître le chargement de l'application. – lsalamon

Questions connexes