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!
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
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. –
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