在.NET中,我是否可以在没有.config文件的情况下指定supportedRuntime(或任何其他配置参数)?

17

我有一个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自解压程序,但也不是一个选项,因为我不能自定义其界面。


我会自己发布一个答案。IExpress,随Windows一起提供的工具,似乎是解决这个问题的好方法。 - rgargente
1个回答

13
.NET可执行文件包含一小段本机代码,旨在将适当的CLR版本加载到进程中。
装载器调用shim(MSCOREE.DLL,.NET可执行文件具有该DLL的本机依赖项)以加载CLR(v4中的CLRCreateInstance)。 <startup>配置元素的内容由shim处理。
这意味着,您不能在托管代码中处理<startup>元素,因为此时还没有CLR(也没有任何托管代码)。唯一的方法是编写自己的CLR主机。我认为,更容易的方法是使用配置文件发布应用程序,或构建.NET 4/4.5版本。

2
你说得没错,控制.NET版本的信息必须在本地代码中处理,不能依靠托管任何东西。但是,你从那里跳到了配置文件,好像本地代码只能读取配置文件,而不能(例如)读取存储在.exe中的PE头或清单资源。也许你是对的,需要配置文件,但如果是这样,那是因为Shim编码为仅读取配置文件,而不是因为在制作检查.exe文件的本地Shim时存在任何技术难题。 - Ben Voigt
有一个从内嵌资源中加载配置的 shim 就太好了。我在想是否有其他 CLR shim,具有更多的配置选项。 - JustAMartin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接