2010-10-17 63 views
14

我们的应用程序使用VS 2008构建,使用Linq并将Target Framework设置为.NET Framework3.5。如何强制应用程序使用.NET 3.5或更高版本?

只有在计算机上安装了.NET 3.5或4时才能正常工作。

但是,在安装了.NET 2(或3.0)和.NET 4的计算机上,应用程序使用.NET 2加载,并在访问Linq时崩溃,因为它查找.NET 3.5库。

在app.config中使用标签似乎没有帮助,因为它指定CLR版本,在.NET 3.5中为2。

请注意,我们的安装验证是否安装了.NET 3.5或更高版本。

有没有办法告诉应用程序加载:

  • 最高CLR发现,或
  • CLR 4如果已安装,并CLR 2如果CLR 4未安装,或者
  • CLR 2如果安装了.NET 3.5并且如果未安装.NET 3.5,则为CLR 4

(请注意,类似的问题在the Community Content section of the Element documentation没有回答)

回答

13

成型的问题使我的答案。正如the Element documentation提到,

当运行时 的多个版本的支持下,第一个元素 应该指定最优选 版本的运行时,最后 元素应指定至少 首选版本。

这样就实现了第二个选项的方式(“CLR 4如果已安装,和CLR 2是CLR 4未安装”)是扭转的app.config的元素的顺序:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
     <supportedRuntime version="v4.0"/> 
     <supportedRuntime version="v2.0.50727"/> 
    </startup> 
</configuration> 

这样,如果安装了.NET 4,它将被加载,如果不是,则会加载较早的版本。

+1

您无法使用此设置进行调试 - 它提供了一个错误,VS2008不支持.NET 4。尽管在VS之外运行发布版本,但它工作正常。 – ChrisF 2010-10-17 12:25:25

+0

至少在Framework v3.5中,如果元素不在文件的末尾(之前),那么我有过应用程序无法启动的经验。如果你遇到启动问题,值得尝试将这段配置移到文件末尾。 – SteveWilkinson 2011-12-21 22:06:45

+0

如果我只支持v4.0作为SupportedRuntime,并且系统仅支持v4.5,那么它会启动v.4.5吗?如何强制使用一个版本? – Kamilos 2014-01-27 09:56:56

-1

如果您有一个调用.NET DLL的非托管EXE,则还需要创建一个foo.exe.config文件,其中包含上面的<startup>...块。

0

另一个有用的链接是MSDN上的this page。这将显示app.config中所需的所有值,如果您只想定位客户端配置文件或需要完整配置文件。

0

.NET Framework版本3.0和3.5使用CLR的版本2.0.50727。