【问题标题】:Can I specify supportedRuntime (or any other config parameter) without a .config file in .net?我可以在 .net 中指定没有 .config 文件的supportedRuntime(或任何其他配置参数)吗?
【发布时间】:2012-09-01 03:54:58
【问题描述】:

我有一个 WinForms 应用程序,它应该很容易使用 .exe 文件进行部署。它使用框架 2.0,因此默认情况下它不适用于 Windows 8。如果我包含具有以下参数的 .config 文件,它在 W8 上可以正常工作:

<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

但是,现在我必须部署两个文件,这是不可接受的。我可以做些什么来将这些参数“嵌入”到 exe 本身中?

我尝试过使用 WinZip 自解压器,但它也不是一个选项,因为我无法自定义它的界面。

【问题讨论】:

  • 我会自己发布一个答案。包含在 Windows 中的 IExpress 似乎是解决问题的好方法。

标签: c# .net winforms configuration windows-8


【解决方案1】:

.NET 可执行文件包含一小段本机代码,旨在将适当的 CLR 版本加载到进程中。

加载程序调用 shim(MSCOREE.DLL,.NET 可执行文件具有此 DLL 的本机依赖项)以加载 CLR(v4 中为CLRCreateInstance)。
&lt;startup&gt; 配置元素的内容由 shim 处理。

这意味着,您不能在托管代码中处理 &lt;startup&gt; 元素,因为此时没有 CLR(和任何托管代码)。唯一的方法是编写自己的 CLR 主机。我认为,使用配置文件发布应用程序或构建 .NET 4/4.5 版本要容易得多。

【讨论】:

  • 谢谢丹尼斯,这很有帮助
  • 您当然是对的,控制 .NET 版本的信息必须在本机代码中处理,而无需托管任何东西。但是然后你从那里跳到配置文件,好像本机代码只允许读取配置文件,而不是(例如)存储在 .exe 中的 PE 头或清单资源可能你是对的,配置文件需要,但如果需要,那是因为 shim 被编码为仅读取配置文件,而不是因为制作检查 .exe 文件的本机 shim 存在任何技术困难。
猜你喜欢
  • 2015-09-02
  • 2015-06-29
  • 1970-01-01
  • 2011-10-08
  • 2011-06-02
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
相关资源
最近更新 更多