有没有办法在.NET Core中只使用一个文件来运行控制台应用程序?

在.NET框架中,您可以创建一个将从命令行运行的.EXE文件,而无需任何额外的配置文件(如果使用ILMerge,则可以将所有.DLL引用放入1 .EXE程序集中)。

我正在尝试使用.NET Core来完成同样的事情,但到目前为止还没有成功。 即使是最简单的没有依赖项的Hello World应用程序,也需要有一个名为.runtimeconfig.json的文件才能使用dotnet.exe运行。

 dotnet F:\temp\MyApp.dll 

.runtimeconfig.json的内容如下:

 { "runtimeOptions": { "framework": { "name": "Microsoft.NETCore.App", "version": "1.1.1" } } } 

如果没有此配置文件与.DLL在同一文件夹中,我会收到以下错误:

 A fatal error was encountered. The library 'hostpolicy.dll' required to execute the application was not found in 'F:\temp'. 

我的问题是:有没有办法改变应用程序,所以它不需要这个配置文件存在,所以这些信息的默认值是在.DLL中编译但可以通过添加配置文件来覆盖?

注意:如果平台具有正确版本的.NET Core,我还要确保它“正常工作”而不管它上面安装的平台。

背景

我试图获得一个流畅的用户体验,运行一些有时很有用的实用程序,但很少需要。 由于似乎不可能使用从客户端应用程序作为控制台应用程序引用的相同.DLL ,因此下一个最好的方法是拥有一个可以在没有任何依赖性的情况下下载和运行的文件

例如,在Java中,您只需在任何支持的平台上下载.jar文件并运行:

 java .jar .SomeClass [args] 

并且它将“正常工作”而没有任何额外的文件。 如何使用.NET Core获得类似的用户体验?

简而言之,我想尽量避免“首先解压缩到目录”的额外步骤……

目前,没有用于创建单个可执行文件的故障安全方法。 由于涉及很多类型转发dll文件,即使ILMerge和类似工具也可能无法产生正确的结果(尽管这可能会有所改善,但问题是这些方案未经过大量测试,尤其是在生产应用程序中)

目前有两种部署.NET Core应用程序的方法:

  • 作为“可移植应用程序”/“依赖于框架的应用程序” ,需要在目标机器上安装dotnet可执行文件并安装框架。 这里, XYZ.runtimeconfig.json用于确定要使用的框架版本,并指定运行时参数。 此部署模型允许在各种平台(windows,linux,mac)上运行相同的代码
  • 作为“自包含应用程序” :此处整个运行时包含在已发布的输出中,并生成可执行文件(例如yourapp.exe )。 此输出特定于平台(通过运行时标识符设置),并且只能在目标操作系统上运行。 但是,生成的可执行文件只是一个小垫片,可以启动运行时并加载应用程序的主dll文件。 这也允许XYZ.runtimeconfig.json设置其他运行时属性,如垃圾收集设置。(将其视为“新” app.config文件)

将来, CoreRT运行时 (在编写本文时仍在开发中)旨在允许创建特定于运行时的单个预编译本机可执行文件,而不需要任何其他文件。