2010-03-26 4 views
3

J'ai une application basée sur .NET 2 runtime. Je veux ajouter un peu de support pour .NET 4 mais je ne veux pas (à court terme), convertir l'application entière (qui est très grande) pour cibler .NET 4.Est-il possible de charger un assembly ciblant une version d'exécution .NET différente dans un nouveau domaine d'application?

J'ai essayé le ' approche évidente de créer un fichier .config d'application, ayant ceci:

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

mais je suis tombé sur quelques problèmes que je l'ai noté here.

J'ai eu l'idée de créer un domaine d'application distinct. Pour le tester, j'ai créé un projet WinForm ciblant .NET 2. Je puis créé une bibliothèque de classes .NET ciblant 4. Dans mon projet WinForm, j'ai ajouté le code suivant:

 AppDomainSetup setup = new AppDomainSetup(); 
     setup.ApplicationBase = "path to .NET 4 assembly"; 
     setup.ConfigurationFile = System.Environment.CurrentDirectory + 
      "\\DotNet4AppDomain.exe.config"; 

     // Set up the Evidence 
     Evidence baseEvidence = AppDomain.CurrentDomain.Evidence; 
     Evidence evidence = new Evidence(baseEvidence); 

     // Create the AppDomain  
     AppDomain dotNet4AppDomain = AppDomain.CreateDomain("DotNet4AppDomain", evidence, setup); 
     try 
     { 
      Assembly doNet4Assembly = dotNet4AppDomain.Load(
       new AssemblyName("MyDotNet4Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=66f0dac1b575e793")); 
      MessageBox.Show(doNet4Assembly.FullName); 
     } 
     finally 
     { 
      AppDomain.Unload(dotNet4AppDomain); 
     } 

fichier Mon DotNet4AppDomain.exe.config ressemble à ceci:

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

Malheureusement, cela jette le BadImageFormatException quand dotNet4AppDomain.Load est exécuté. Est-ce que je fais quelque chose de mal dans mon code, ou est ce que j'essaye de faire juste ne pas aller travailler?

Merci!

Répondre

1

Vous ciblez le 2.0 donc c'est celui chargé en mémoire ... ils vous demandent de charger une image 4.0 ... il ne peut pas fonctionner vous devez tourner une nouvelle instance d'exécution de la bonne version si vous vouloir le faire. La seule façon de le faire peut être d'héberger un deuxième CLR dans votre processus comme expliqué dans Is it possible to host the CLR in a C program?, ce qui est devenu possible avec .Net 4.0.

+0

J'espérais qu'avoir un AppDomain séparé me permettrait d'avoir différentes versions du CLR dans un processus. L'attribut useLegacyV2RuntimeActivationPolicy implique qu'avec l'installation d'un .NET 4 runtime, vous pouvez démarrer l'activation avec .NET 2, et en utilisant l'élément supportedRuntime, vous pouvez dire 'load .NET 4 assemblies', selon les besoins. C'est exactement ce que je veux accomplir, mais malheureusement je suis confronté au problème décrit dans l'autre article. J'espérais que des AppDomains séparés me permettraient de réaliser la même chose, avec un peu plus de contrôle. – Notre

+0

J'ai édité ma réponse en tant que .Net 4.0 faire charger deux instances de CLR possibles dans le même hôte. En ce qui concerne useLegacyV2RuntimeActivationPolicy, je pense que vous le confondez avec quelque chose d'autre, car dans la plupart des cas, cela ne concerne que les assemblages en mode mixte. –

+0

J'ai utilisé useLegacyV2RuntimeActivationPolicy avec succès dans le code managé 'pur' .NET, dans d'autres cas. Mais dans cette dernière application où j'ai essayé de l'appliquer, il y avait de mauvais effets secondaires. Je commence à penser qu'il n'est pas possible de résoudre mon problème dans le cas .NET géré pur (à moins de tout recompiler pour cibler .NET 4 runtime), même en utilisant AppDomains différents. J'ai également eu cette conversation sur le forum MSDN - http://social.msdn.microsoft.com/Forums/en/netfxappcompatprerelease/thread/a181e9b0-9d67-4d3c-80c4-11529196d3bc Serait curieux d'obtenir votre prenez-le. – Notre

0

Je serais enclin à soupçonner que la version 2 du .NET runtime n'a aucune idée ou compréhension de .NET 4. Par le son et la nature de votre question, vous avez affaire à l'inverse .... Avez-vous essayé de compiler et de cibler .NET 4 pour charger la bibliothèque d'exécution .NET 2 ... Je ne pense pas qu'il soit possible d'inter-mélanger différentes versions de code compilé (une pour .NET 4 et l'autre pour .NET 2) dans le même processus ...

+0

Je suis sûr que vous avez raison de dire que .NET 2 runtime ne sait rien sur .NET 4 runtime. Mais, comme indiqué dans mon commentaire précédent, il y a un peu de "magie" qui permet aux deux de co-exister dans le même processus, en utilisant l'attribut useLegacyV2RuntimeActivationPolicy et l'élément supportedRuntime. Je n'ai pas essayé le contraire, mais je suppose que je ne suis pas clair sur comment cela m'aiderait ... – Notre

Questions connexes