我将WPF应用程序的目标.NET框架从3.5更改为4.0。
进行此更改后,我注意到VS2010生成了一个app.config文件,并将其放在主项目文件夹中。它的构建操作设置为“none - 不复制”。
此app.config文件包含以下XML:
<?xml version="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
我项目的.csproj文件包含:
<Project
ToolsVersion="4.0" DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
问题:
<supportedRuntime version="4.0"
与.csproj中的<Project ToolsVersion="4.0"
之间的含义有何不同?是否覆盖了另一个,或者它们实际上意味着不同的东西?修改
还有一个问题:
如果我从头开始创建WPF 4.0应用程序,为什么默认情况下没有创建app.config文件? (这不意味着文件是不必要的吗?)
答案 0 :(得分:4)
App.config文件告诉.Net 运行时程序集需要.Net 4.0
它将作为<YourApp>.exe.config
复制到outout文件夹。
答案 1 :(得分:4)
这篇Microsoft博客文章很好地解释了它:
app.config文件有什么处理?
如果您将项目更改为定位Full Framework,VS将添加一个配置文件(app.config),将该应用程序声明为“完整”应用程序。
这使CLR加载程序能够阻止任何仅在具有客户端配置文件的计算机上完全定位的NET4应用程序。在这种情况下,CLR会提示用户安装NET4。
E.g。你可能会看到这个对话框:
请注意,在NET4 Beta1和NET3.5 SP1客户端配置文件中,如果app.config缺少CLR,则假设您定位了完整框架。现在已经逆转了。 换句话说,如果您的NET4应用程序缺少app.config,默认情况下CLR会假定您的应用程序定位到NET4客户端配置文件!因此,当您的应用程序需要加载程序集时,它可能会随机崩溃不在客户档案中。
具体答案:
正如SLaks所说,.csproj设置告诉编译器要使用的框架版本,而运行时(CLR)使用app.config文件来确定用户需要哪个(如果有的话)框架版本下载。
即使构建操作为“none - do not copy”,app.config也会被复制到输出中。 app.config是一个特殊文件,会自动重命名为“[name_of_app] .exe.config”,然后复制到输出目录。
对于WPF 4.0应用程序,如果应用程序面向.NET 4.0客户端配置文件,则可以省略app.config。如果它针对完整的.NET 4.0框架(包括像asp.net这样的东西),则必须保留该文件。
默认情况下,未创建此文件的原因是默认情况下WPF 4.0应用程序以.NET Framework 4.0 Client Profile为目标。由于运行时将假定所有.NET 4.0应用程序仅需要安装客户端配置文件,因此一切都会正常。