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

时间:2017-06-29 21:29:13

标签: c# .net console-application command-line-interface .net-core

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

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

dotnet F:\temp\MyApp.dll

<MyApp>.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'.

我的问题是:是否有某种方法可以更改应用程序,因此它不会要求此配置文件存在,以便此信息的默认值在{{ 1}}但可以通过添加配置文件来覆盖吗?

  

注意:我也想确保它正常工作&#34;无论它安装在哪个平台上,只要平台具有正确版本的.NET Core。

背景

我正在努力获得顺畅的用户体验,以便运行一些有时很有用的实用程序,但很少需要。由于它是doesn't appear to be possible to use the same .DLL that is referenced from a client application作为控制台应用程序,所以下一个最好的方法是拥有一个单个文件,可以在没有任何依赖的情况下下载和运行。

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

.jar

它会&#34;只是工作&#34;没有任何额外的文件。如何使用.NET Core获得类似的用户体验?

简而言之,我想尽量避免额外的步骤&#34;首先解压到目录&#34; ...

3 个答案:

答案 0 :(得分:13)

更新2018年:.NET Core 3.0旨在启用新方案:将.NET Core运行时和所有应用程序依赖项打包到单个可执行文件中。

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

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

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

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

答案 1 :(得分:3)

console app上使用.NET Core 2.2进行了测试:

    输出项目中的
  1. 参考Microsoft.DotNet.ILCompiler软件包。您需要在Visual Studio设置中添加MyGet软件包存储库。 *
  2. 通过命令行发布项目, dotnet发布C:\ src \ App \ App.csproj -c版本-r win-x64 -o output-win-x64 。如果没有安装“用于C ++的桌面开发”组件,请在Visual Studio安装程序中执行此操作,否则该命令将失败。
  3. 转到输出文件夹(例如“ C:\ src \ App \ output-win-x64”)并获取本机映像(.exe文件)。

在Windows上,它生成了功能完整的5Mb .exe文件(与原始的独立发布相比,文件夹大小为〜60Mb)。在macOS上,ILComplier产生的输出没有任何错误,但应用程序崩溃并带有未处理的期望(与LINQ表达式相同)。

*转到“工具->选项->程序包管理器->程序包源”,然后在 https://dotnet.myget.org/F/dotnet-core/api/v3/index.json

中添加新源

答案 2 :(得分:1)

在.NET Core 3.0中是可能的

之所以这样,是因为当前的预览(5)允许使用它,并且(据我所知)可以正常工作。

通过在项目文件(.csproj)中使用以下属性来启用该功能

<PropertyGroup>
    <PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>

还有其他选择,例如将 pdb 打包到捆绑包中,或保留某些文件。

很难找到文档(因为它仍然是预览版),但是在提案阶段有一份详尽的文档,其中指定了其用法:https://github.com/dotnet/designs/blob/master/accepted/single-file/design.md

真正的它正常工作

通过自包含部署工作流程将这种技术结合在一起,您可以为用户获得真正的“即用即用”体验,他们甚至不必安装.NET Core运行时来运行您的应用。

我目前正在将应用程序作为单个 .exe 文件部署到我的客户端。

在此处详细了解:https://docs.microsoft.com/en-us/dotnet/core/deploying/#self-contained-deployments-scd