web-dev-qa-db-fra.com

Quelle "configuration supplémentaire" est nécessaire pour référencer un assembly en mode mixte .NET 2.0 dans un projet .NET 4.0?

J'ai un projet dans lequel j'aimerais utiliser certaines des fonctionnalités .NET 4.0, mais l'une des conditions essentielles est que je puisse utiliser le framework System.Data.SQLite compilé avec 2.X. Je vois que cela est possible, par exemple la réponse acceptée ici mais je ne vois pas comment y parvenir.

Lorsque je tente simplement d'exécuter mon projet 4.0 en faisant référence à l'assembly 2.X, je reçois:

Le mode mixte Assembly est construit sur la version 'v2.0.50727' du moteur d'exécution et ne peut pas être chargé dans le moteur d'exécution 4.0 sans informations de configuration supplémentaires.

Quelle "configuration supplémentaire" est nécessaire?

515
jamone

Pour utiliser un CLR 2.0 Assembly en mode mixte, vous devez modifier votre fichier App.Config afin d'inclure:

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

La clé est le drapeau useLegacyV2RuntimeActivationPolicy. Ainsi, le CLR utilise la dernière version (4.0) pour charger votre assembly en mode mixte. Sans cela, cela ne fonctionnera pas.

Notez que cela ne concerne que les assemblys en mode mixte (C++/CLI). Vous pouvez charger tous les assemblys CLR 2 gérés sans spécifier cela dans app.config.

680
Reed Copsey

This message sur le forum sur le .NET Framework Developer Center. Cela pourrait donner un aperçu.

(Ajouter au fichier de configuration de l'application.)

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

Selon la version du framework que vous ciblez, vous voudrez peut-être regarder ici pour obtenir la chaîne correcte:

http://msdn.Microsoft.com/en-us/library/ee517334.aspx

J'ai perdu des heures à essayer de comprendre pourquoi ma publication ciblée .Net 4.0 nécessitait la version complète. Je l'ai utilisé à la fin:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0.30319" 
               sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
13
Anthony Wieser

Une fois que vous avez défini le fichier app.config, Visual Studio en génère une copie dans le dossier bin nommé App.exe.config. Copiez ceci dans le répertoire de l'application pendant le déploiement. Cela semble évident, mais étonnamment, beaucoup de gens passent à côté de cette étape. Les développeurs WinForms ne sont pas habitués à configurer des fichiers :).

11
Raheel Khan

L'utilisation d'assemblages 2.0 et 4.0 n'est pas tout à fait simple.

Les commandes ORDER des déclarations de structure prises en charge dans app.config ont en réalité un effet sur l'exception de lancement du mode mixte. Si vous inversez l'ordre de déclaration, vous obtiendrez une erreur en mode mixte. C'est le but de cette réponse.

Donc, si vous obtenez l'erreur dans une application Windows Forms, essayez ceci, principalement des applications Windows Forms.

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
    <supportedRuntime version="v2.0.50727"></supportedRuntime>
  </startup>

Ou si le projet n'est pas Windows Form. Dans un projet Web, ajoutez ceci au fichier web.config.

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v2.0.50727"></supportedRuntime>
  </startup>
8
Wiser Web

A été capable de résoudre le problème en ajoutant l'élément "startup" avec l'élément "useLegacyV2RuntimeActivationPolicy".

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v2.0.50727"/>
</startup>

Mais il a fallu le placer comme premier élément enfant de la balise de configuration dans App.config pour que cela prenne effet.

<?xml version="1.0"?>
  <configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      <supportedRuntime version="v2.0.50727"/>
    </startup>
  ......
....
7
Deshan

Ce qui précède n'a pas fonctionné pour moi (je travaille sur une application Web) - mais cela n'a pas ...

Editez le fichier sgen.exe.config dans le dossier (je devais d'abord en créer un); C:\Program Files (x86)\SDK Microsoft\Windows\v8.0A\bin\NETFX 4.0 Outils (il y en a aussi un dans le dossier v7.0, mais je n’ai pas besoin de le changer, j’utilise VS2012)

Le contenu du XML devrait ressembler à ceci (identique aux réponses précédentes)

<?xml version ="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
    </startup>
</configuration>
5
MarkPm

Si vous travaillez dans un service Web et que l’assembly v2.0 est une dépendance qui a été chargée par WcfSvcHost.exe, vous devez inclure

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

dans le fichier ..\Microsoft Visual Studio 10.0\Common7\IDE\WcfSvcHost.exe.config

De cette façon, Visual Studio pourra envoyer les bonnes informations via le chargeur lors de l'exécution.

5
MrBit

J'ai rencontré ce problème lorsque nous avons changé en Visual Studio 2015. Aucune des réponses ci-dessus n'a fonctionné pour nous. En fin de compte, nous avons réussi à ajouter le fichier de configuration suivant à TOUS les exécutables sgen.exe sur la machine

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

Particulièrement à cet emplacement, même lorsque nous ciblions .NET 4.0:

Outils C:\Program Files (x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6

4
Run CMD

J'ai utilisé cette config:

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

A travaillé pour moi

3
OmriSela

J'avais ce problème lors de la mise à niveau vers Visual Studio 2015 et aucune des solutions publiées ici ne faisait la moindre différence, bien que la configuration soit correcte, l'emplacement de la modification ne l'est pas. J'ai résolu ce problème en ajoutant cette configuration:

<startup useLegacyV2RuntimeActivationPolicy="true">
</startup>

Pour: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\TE.ProcessHost.Managed.exe.config

Puis redémarré Visual Studio.

1
Michael Armitage

J'éprouvais cette même erreur et passais pour toujours à ajouter les instructions de démarrage suggérées à divers fichiers de configuration de ma solution, en essayant d'isoler la non-concordance de la structure. Rien n'a fonctionné. J'ai également ajouté informations de démarrage dans mes schémas XML . Cela n'a pas aidé non plus. L'examen du fichier à l'origine du problème (qui indiquerait simplement qu'il a été "déplacé ou supprimé") a révélé qu'il s'agissait en fait du compilateur de licences (LC).

La suppression du fichier licences.licx incriminé semble avoir résolu le problème.

0
mono código

J'ai trouvé un moyen de contourner cela après 3-4 heures de googler. J'ai ajouté le suivant

<startup selegacyv2runtimeactivationpolicy="true">
  <supportedruntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>

Si cela ne résout pas votre problème, alors -> Dans les références de projet Right Click on DLL où vous obtenez une erreur -> Select Properties--> Check the Run-time Version -> S'il s'agit de v2.0.50727 alors nous connaissons le problème. Le problème est le suivant: - Vous rencontrez 2.0 Version of respective DLL. La solution est la suivante: - Vous pouvez delete the respective DLL à partir des références du projet, puis download the latest version of DLL's à partir du site Web correspondant et ajouter la référence de la dernière version DLL référence alors cela fonctionnera.

0
venu

Ajouter les éléments suivants à cet emplacement C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin\NETFX 4.0 Outils\x64 Nom de fichier: sgen.exe.config (si vous ne trouvez pas ce fichier, créez-en un et ajoutez-en un)

 <?xml version ="1.0"?>

<configuration>
 <runtime>        
        <generatePublisherEvidence enabled="false"/>    
    </runtime>

    <startup useLegacyV2RuntimeActivationPolicy="true">

                <supportedRuntime version="v4.0" />

    </startup>    

</configuration>

Faire cela a résolu le problème

0
Muheeb

J'utilise

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

Cela fonctionne mais juste avant la balise de </configuration> sinon la balise de démarrage ne fonctionne pas correctement

0
RubenP5

J'étais confronté à un problème similaire lors de la migration de code de VS 2008 à VS 2010 Le fait d'apporter des modifications au fichier App.config a résolu le problème pour moi.

<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"
         sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
</configuration>
0
Sonali.thecoder