代码之家  ›  专栏  ›  技术社区  ›  Notre

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

  •  3
  • Notre  · 技术社区  · 15 年前

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

    我尝试了创建application.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文件如下:

    <启动使用legacyv2runtimeactivationpolicy=“true”>
    <supportedRuntime version=“v4.0”/>
    </startup>
    

    不幸的是,在执行dotNet4AppDomain.Load时,这会引发badImageFormatException。我是在代码中做了什么错误的事情,还是我试图做的事情不起作用?

    谢谢您!

    2 回复  |  直到 12 年前
        1
  •  1
  •   Community CDub    8 年前

    你的目标是2.0,所以它是加载到内存中的那个…你要求它加载4.0图像…它不能工作如果你想这样做,你需要旋转一个正确版本的新运行时实例。

    唯一能做到这一点的方法可能是在您的进程中托管第二个clr,如中所述。 Is it possible to host the CLR in a C program? 女巫可以使用.NET 4.0。

        2
  •  0
  •   t0mm13b    15 年前

    我倾向于怀疑.NET运行时的版本2对.NET 4既不了解也不了解。从问题的声音和性质来看,您正相反地处理它……您是否尝试编译和瞄准.NET 4以加载.NET 2运行库……我认为不可能在中混合不同版本的编译代码(一个用于.NET 4,另一个用于.NET 2)。同样的过程…

    推荐文章