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

526

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

Lorsque j'essaie de lancer mon projet 4.0 tout en référençant l'assembly 2.X, j'obtiens:

L'assemblage en mode mixte est construit par rapport à la version 'v2.0.50727' du runtime et ne peut pas être chargé dans le runtime 4.0 sans informations de configuration supplémentaires.

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

jamone
la source
IMPORTANT: Si l'erreur se produit avec la colonne d'erreur "Fichier" en tant que SGEN, le correctif doit être dans un fichier sgen.exe.config, à côté de sgen.exe. Par exemple, pour VS 2015, créez C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config. Source: assemblage SGEN en mode mixte Contenu minimal du fichier:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
ToolmakerSteve

Réponses:

686

Pour utiliser un assembly en mode mixte CLR 2.0 , vous devez modifier votre fichier App.Config pour inclure:

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

La clé est le useLegacyV2RuntimeActivationPolicydrapeau. Cela provoque le CLR à utiliser 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 le spécifier dans app.config.

Reed Copsey
la source
@Reed J'ai essayé votre suggestion, mais l'exception apparaît toujours. J'ai revérifié le fichier app.config qui est copié dans mon dossier EXE et cela ne fonctionne toujours pas. Il apparaît lors de l'utilisation de log4net. Je ne trouve rien sur cette erreur concernant log4net sauf ici: stackoverflow.com/questions/1866735/log4net-and-net-4-0 , mais cela ne dit pas grand-chose. Avez-vous des idées sur la façon d'obtenir plus d'informations sur mon problème particulier?
Dave
@Dave: Cela suggère que vous pouvez simplement utiliser une version native .NET 4 de log4net - qui semble être la meilleure option. S'il existe une version .NET 4, utilisez-la ...
Reed Copsey
@Reed il n'y en a pas, et j'ai en fait interprété cette réponse comme signifiant que vous devrez compiler log4net vous-même. Je suppose que je peux le faire, mais je préfère simplement prendre leur binaire précompilé et le référencer à partir de mon projet. J'y reviendrai un peu plus. Mais pouvez-vous penser pourquoi changer app.config ne le fait pas fonctionner? J'ai pensé que je devais peut-être utiliser programname.exe.config, mais j'ai essayé cela aussi et cela n'a pas fonctionné. Dans mon expérience limitée, l'un ou l'autre nom de fichier fait la même chose.
Dave
19
Ce qui m'a aidé, c'est de mettre cette ligne dans le fichier de configuration de NUnit : <startup useLegacyV2RuntimeActivationPolicy = "true"> <supportedRuntime version = "v4.0" /> <requiredRuntime version = "v4.0.20506" /> </startup>
Filip Zawada
76
Microsoft devrait créer un bouton dans la boîte de dialogue d'exception: "Rechercher ce message d'exception sur stackoverflow"
Davi Fiamenghi
35

Ce message de forum sur le .NET Framework Developer Center. Cela pourrait fournir un aperçu.

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

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>
JasCav
la source
2
Comment cette configuration d'application doit-elle être utilisée pour la génération NANT?
sagar
14

En fonction de 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 version ciblant le client .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>
Anthony Wieser
la source
11

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

Raheel Khan
la source
Une autre façon consiste à supprimer app.config, puis à en ajouter un nouveau dans Projet-> Ajouter-> Nouvel élément et choisissez Général-> Fichier de configuration d'application (ce qui n'est pas la même chose que de créer un fichier texte appelé app.config)
smirkingman
8

L'utilisation d'assemblages 2.0 et 4.0 ensemble n'est pas assez simple.

L'ORDRE des déclarations de framework prises en charge dans app.config a en fait un effet sur l'exception du mode mixte lancé. Si vous retournez l'ordre de déclaration, vous obtiendrez une erreur de mode mixte. Tel est l'objet 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 cela au fichier web.config.

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v2.0.50727"></supportedRuntime>
  </startup>
Web plus sage
la source
7

A pu résoudre le problème en ajoutant l' élément "startup" avec l' ensemble d'attributs "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 qu'il 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>
  ......
....
Deshan
la source
1
Qu'est-il arrivé à celui avec qui version="v2.0"?
SamB
1
Le numéro de build est requis pour 2.0 mais pas pour 4.0, la version supérieure est donc incorrecte. Le fond est correct.
ickydime
5

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

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

Le contenu du XML devrait ressembler à ceci (idem dans les 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>
MarkPm
la source
5

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 .. \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfSvcHost.exe.config file

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

MrBit
la source
4

J'ai rencontré ce problème lorsque nous sommes passés à Visual Studio 2015 . Aucune des réponses ci-dessus n'a fonctionné pour nous. À la fin, nous l'avons fait fonctionner en ajoutant 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 endroit, même lorsque nous ciblions .NET 4.0:

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

Exécutez CMD
la source
Peux-tu être plus précis? Voulez-vous dire que vous avez ajouté ces options de configuration à tous les fichiers * .config existants ou que vous avez créé un fichier .config pour sgen.exe?
Adam Spicer
Pour moi, je rencontrais ce problème avec les projets de test Visual Studio 2015. Ce message m'a aidé. devbraindump.wordpress.com/2015/07/29/hello-world
Adam Spicer
1
@AdamSpicer Nous l'avons ajouté à tous les fichiers .config de tous les sgen.exe. S'il n'en existait pas, nous en avons créé un.
Exécutez CMD
3

J'ai utilisé cette config:

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

Travaillé pour moi

OmriSela
la source
3
devrait être v2.0.50727, pour le numéro de build v2.0 est nécessaire, mais pour le numéro de build v4.0 est pas nécessaire
linquize
1

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

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

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

Puis redémarré Visual Studio.

Michael Armitage
la source
0

J'ai trouvé un moyen de contourner cela après 3-4 heures de recherche sur Google. J'ai ajouté ce qui suit

<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 du projet Right Click on DLLoù vous obtenez une erreur -> Select Properties-> Check the Run-time Version-> Si c'est le cas, v2.0.50727nous connaissons le problème. Le problème est: - vous rencontrez la 2.0 Version of respective DLL. solution est: - Vous pouvez à delete the respective DLLpartir des références du projet, puis à download the latest version of DLL'spartir du site Web correspondant et ajouter la référence de la dernière référence de DLL de version, cela fonctionnera.

venu
la source
1
Cela résoudrait le problème car vous supposez que la dernière version de la DLL est compilée avec une version plus récente de .NET?
Lucas
0

Je rencontrais cette même erreur et j'ai passé indéfiniment à ajouter les instructions de démarrage suggérées à divers fichiers de configuration dans ma solution, essayant d'isoler la non-concordance du framework. Rien n'a fonctionné. J'ai également ajouté des informations de démarrage à mes schémas XML . Cela n'a pas aidé non plus. En regardant le fichier réel qui causait le problème (qui dirait seulement qu'il a été "déplacé ou supprimé"), il s'est avéré qu'il s'agissait en fait du License Compiler (LC).

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

mono código
la source
0

J'étais confronté à un problème similaire lors de la migration de code de VS 2008 vers VS 2010 La modification du 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>
Sonali.thecoder
la source
0

Ajoutez ce qui suit à cet emplacement C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Tools \ x64 FileName: sgen.exe.config (si vous ne trouvez pas ce fichier, créez-en 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

Muheeb
la source
0

J'utilise

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

Cela fonctionne, mais juste avant le </configuration>tag, sinon le tag de démarrage ne fonctionne pas correctement

RubenP5
la source
-1

J'ai également eu ce problème avec la bibliothèque de classe, si quelqu'un a le problème avec la bibliothèque de classe ajoutée à votre application principale. Ajoutez simplement

<startup useLegacyV2RuntimeActivationPolicy="true">

à votre application principale qui serait ensuite choisie par la bibliothèque de classes.

Raghulan Gowthaman
la source
Ceci est une solution incomplète. les noms dans la configuration sont sensibles à la casse, et vous avez oublié un U.
Chuck Dee