3

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

我尝试了创建应用程序 .config 文件的“明显”方法,具有以下内容:

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

但我遇到了一些我在这里注意到的问题。

我想到了创建一个单独的应用程序域。为了测试它,我创建了一个面向 .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。我在我的代码中做错了什么,还是我试图做的只是不起作用?

谢谢!

4

2 回答 2

1

您以 2.0 为目标,因此它是加载到内存中的那个……他们要求它加载 4.0 图像……它无法工作,如果您想这样做,您需要旋转正确版本的新运行时实例.

唯一的方法可能是在您的进程中托管第二个 CLR,如是否可以在 C 程序中托管 CLR?.Net 4.0 使女巫成为可能。

于 2010-03-26T17:35:45.847 回答
0

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

于 2010-03-26T17:39:50.410 回答