我有一个基于.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。我在代码中做错了什么,或者我正在尝试做什么而不去工作?
谢谢!
答案 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)在同一个过程......