当我将目标框架更改为4.0时,为什么我的WPF 3.5应用程序获得了app.config文件?

时间:2010-12-05 21:45:50

标签: .net wpf visual-studio configuration

我将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">

问题:

  1. app.config中的<supportedRuntime version="4.0"与.csproj中的<Project ToolsVersion="4.0"之间的含义有何不同?是否覆盖了另一个,或者它们实际上意味着不同的东西?
  2. 如果没有复制到输出目录,app.config文件会执行任何操作吗?
  3. 我可以删除app.config文件而不会破坏任何内容吗?
  4. 修改

    还有一个问题:

    如果我从头开始创建WPF 4.0应用程序,为什么默认情况下没有创建app.config文件? (这不意味着文件是不必要的吗?)

2 个答案:

答案 0 :(得分:4)

App.config文件告诉.Net 运行时程序集需要.Net 4.0 它将作为<YourApp>.exe.config复制到outout文件夹。

  1. .csproj仅在编译时使用。
  2. 否; App.config由运行时从程序集的目录
  3. 读取
  4. 不,你不应该。

答案 1 :(得分:4)

这篇Microsoft博客文章很好地解释了它:

http://blogs.msdn.com/b/jgoldb/archive/2010/04/12/what-s-new-in-net-framework-4-client-profile-rtm.aspx

  

app.config文件有什么处理?

     

如果您将项目更改为定位Full Framework,VS将添加一个配置文件(app.config),将该应用程序声明为“完整”应用程序。

     

alt text

     

这使CLR加载程序能够阻止任何仅在具有客户端配置文件的计算机上完全定位的NET4应用程序。在这种情况下,CLR会提示用户安装NET4。

     

E.g。你可能会看到这个对话框:

     

alt text

     

请注意,在NET4 Beta1和NET3.5 SP1客户端配置文件中,如果app.config缺少CLR,则假设您定位了完整框架。现在已经逆转了。   换句话说,如果您的NET4应用程序缺少app.config,默认情况下CLR会假定您的应用程序定位到NET4客户端配置文件!因此,当您的应用程序需要加载程序集时,它可能会随机崩溃不在客户档案中。

具体答案:

  1. 正如SLaks所说,.csproj设置告诉编译器要使用的框架版本,而运行时(CLR)使用app.config文件来确定用户需要哪个(如果有的话)框架版本下载。

  2. 即使构建操作为“none - do not copy”,app.config也会被复制到输出中。 app.config是一个特殊文件,会自动重命名为“[name_of_app] .exe.config”,然后复制到输出目录。

  3. 对于WPF 4.0应用程序,如果应用程序面向.NET 4.0客户端配置文件,则可以省略app.config。如果它针对完整的.NET 4.0框架(包括像asp.net这样的东西),则必须保留该文件。

  4. 默认情况下,未创建此文件的原因是默认情况下WPF 4.0应用程序以.NET Framework 4.0 Client Profile为目标。由于运行时将假定所有.NET 4.0应用程序仅需要安装客户端配置文件,因此一切都会正常。