在.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; ...
答案 0 :(得分:13)
更新2018年:.NET Core 3.0旨在启用新方案:将.NET Core运行时和所有应用程序依赖项打包到单个可执行文件中。
目前,没有用于创建单个可执行文件的故障安全方法。由于涉及很多类型转发dll文件,即使ILMerge和类似工具也可能无法产生正确的结果(尽管这可能会有所改善,但问题是这些方案未经过大量测试,尤其是在生产应用程序中)
目前有两种部署.NET Core应用程序的方法:
dotnet
可执行文件和已安装的框架。这里,XYZ.runtimeconfig.json
用于确定要使用的框架版本,并指定运行时参数。此部署模型允许在各种平台(windows,linux,mac)上运行相同的代码yourapp.exe
)。此输出特定于平台(通过运行时标识符设置),并且只能在目标操作系统上运行。但是,生成的可执行文件只是一个小垫片,可以启动运行时并加载应用程序的主dll文件。这也允许XYZ.runtimeconfig.json
设置其他运行时属性,如垃圾收集设置。(将其视为“新”app.config
文件)将来,CoreRT runtime - 在编写时仍在开发中 - 旨在允许创建特定于运行时的单个预编译本机可执行文件,而不需要任何其他文件。
答案 1 :(得分:3)
在console app上使用.NET Core 2.2进行了测试:
在Windows上,它生成了功能完整的5Mb .exe文件(与原始的独立发布相比,文件夹大小为〜60Mb)。在macOS上,ILComplier产生的输出没有任何错误,但应用程序崩溃并带有未处理的期望(与LINQ表达式相同)。
*转到“工具->选项->程序包管理器->程序包源”,然后在 https://dotnet.myget.org/F/dotnet-core/api/v3/index.json
中添加新源答案 2 :(得分:1)
之所以这样,是因为当前的预览(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