关于clr:如何强制编译为.NET Framework 4的应用程序在.NET Framework 4.6.1下运行?

How do I force an application compiled to target .NET Framework 4 to run under .NET framework 4.6.1?

我做了大量的研究,没有找到合适的答案。这里是场景。

我有一个针对.NET Framework 4编译的应用程序。在运行时,我希望该应用程序实际在.NET Framework 4.6.1中执行。到目前为止,我找到了两个选择。

  • 在.NET Framework 4.6.1下重新编译应用程序
  • 将configuration/startup/supportedRuntime元素添加到app.config,version="v4.0"sku="netframework,version=v4.6.1"
  • 选项1不可取,因为它需要重新发布软件。

    选项2没有达到我的预期。它似乎检查是否安装了clr 4.0(而不是framework 4.0),如果没有提示下载合适的sku来安装它。安装后,应用程序仍在.NET Framework 4.0下执行。

    作为一个测试,以及这个问题发布的原因,我创建了一个小的控制台应用程序

    1
    Console.WriteLine(System.Net.ServicePointManager.SecurityProtocol);

    如果根据.NET Framework 4编译,则输出为

    Ssl3, Tls

    如果根据.NET Framework 4.6.1编译,则输出为

    Tls, Tls11, Tls12


    I am ... asking about the general case of forcing an application compiled against framework 4.0 to run using framework 4.6.1

    好吧,你已经做的和app.config文件输入。这empowers特征信息,用户不能把程序运行没有installing 4.6.1第一。他要做的全部是冰,单击"按钮。这变得不甚exercised往往4.6.1应该总是被呈现在用户的机器当负责的关于他的冰保鲜加工与更新的Windows更新。如果他intentionally不那么"加压"不是很可能会收到两个阱。

    但实际上这是不是你的问题是什么。你想要你的程序行为两类,它是在线安装4.6.1。这是一个非常不同的鱼壶。做笔记,2)没有工作,你不能在运行时,很容易的傻瓜。编译程序的一targetframeworkattribute埋在你的executable属性文件,那真的是一个"运行时辨别它应该如何来确定的行为。有一个看的见与ildasm.exe,双击《宣言》中看到它。你的app.config录入不重写它。

    问题是,biggest .net 4.5 fundamentally冰与heavily不同而变化的两个极限的运行时组件和框架。重金属会有足够的warranted bumping 5.0版本上。所以你永远的原因很多的痛苦和痛苦的顾客,把每一个把戏了微软的书让(4.5和4.0 IP)的行为像一个程序,如果它是有针对性的4.0。

    不只是一个骗局。一是参考方法的核心组件可存储在C:程序文件(x86))组件的参考目录。他们的主要目标包文件。你曾经是仓库在C:程序文件(x86))是微软的组件的参考。framework.netframework V4.0 originally。当你建造你的程序。如果你retarget你的项目,你用的是v4.6.1.仓库他们是非常不同的。《securityprotocoltype枚举和notably冰在说什么你是不同的,它的获得性双新值。这是一个重大变革,一.net 4.0程序两个冰淇淋liable遭受心脏病发作-当它看起来从宫殿的窗户,看到securityprotocoltype.tls12,它有没有什么想法whatsoever均可以。大厦A与错误的程序包文件的目标造成deeply mystifying exceptions。

    和其他的技巧。臭虫固定后制造.net 4.0稿是selectively打开取决于[ ]《targetframeworkattribute backwards兼容性错误,为确保这两个重要的冰程序不运行时行为要守了。CLR和冰的brim钢管与appcompat开关。我可以点两个源代码文件,但它是在coreclr说太可怕的两种面貌:)

    SO NO、制作程序由两个目标.net 4.0的行为像它运行在一个较高的版本是不可能的。《注册密钥和appcontext开关,你学会了什么是高度特异性的两个servicepointmanager.securityprotocol只是财产。他们都是有一个简单的,因为你是唯一的客户,不想做这个,而TLS版本是重要的。只是确保枚举值,《我不上你的旅行计划。


    测定的特异性servicepointmanager.securityprotocol冰很长的一般问题unrelated 4 4.6.1框架与我不同,我没有明确的答案,因为它不相关的案例(通用用例可能全是特异的,如果你将)。

    特异性的答案,这是described这里:mitigation TLS协议:

    Starting with the .NET Framework 4.6, the
    System.Net.ServicePointManager and System.Net.Security.SslStream
    classes are allowed to use one of the following three protocols:
    Tls1.0, Tls1.1, or Tls 1.2. The SSL3.0 protocol and RC4 cipher are not
    supported.

    如果安装了4.6 +冰德科工,那么你可以改变你的行为的W / O重新编译程序的详细信息,为的只是添加了这条线,你.config档案:

    1
    2
    3
    4
    5
    6
    7
    8
    <configuration>
      ...
      <runtime>
        ...
        <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false" />
      </runtime>
      ...
    </configuration>