是否可以在新的应用程序域中加载针对不同.NET运行时版本的程序集?

时间:2010-03-26 17:27:23

标签: .net runtime version appdomain side-by-side

我有一个基于.NET 2运行时的应用程序。我想为.NET 4添加一些支持,但不希望(在短期内)将整个应用程序(非常大)转换为目标.NET 4。

我尝试了创建应用程序.config文件的“明显”方法,其中包含:

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

但我遇到了一些问题,我注意到here

我想到了创建一个单独的应用程序域。为了测试它,我创建了一个面向.NET 2的WinForm项目。然后我创建了一个面向.NET 4的类库。在我的WinForm项目中,我添加了以下代码:

        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);
        }

我的DotNet4AppDomain.exe.config文件如下所示:

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

不幸的是,这会在执行dotNet4AppDomain.Load时抛出BadImageFormatException。我在代码中做错了什么,或者我正在尝试做什么而不去工作?

谢谢!

2 个答案:

答案 0 :(得分:1)

你定位2.0所以它是加载到内存中的那个...你要求它加载一个4.0图像...它无法工作你需要旋转正确版本的新Runtime实例,如果你想这样做。

这样做的唯一方法可能是在您的流程中托管第二个CLR,就像在Is it possible to host the CLR in a C program?中解释的那样,.Net 4.0可以实现。

答案 1 :(得分:0)

我倾向于怀疑.NET运行时的第2版对.NET 4没有任何线索和理解。根据你的问题的声音和性质,你正在反向处理....有您尝试编译和针对.NET 4加载.NET 2运行时库...我不认为可以混合不同版本的编译代码(一个用于.NET 4,另一个用于.NET 2)在同一个过程......