将其编译为一个独立的二进制文件

3

我编写了一个简单的程序并使用 dotnet publish -c Release -r osx.10.11-x64 进行了编译。

它创建了一个可工作的二进制文件,但是如果我将这个文件移动到其他目录而没有与之相关的其他文件,则该程序无法运行:

发生致命错误,找不到所需的库 libhostfxr.dylib,位于 /Users/me/

有没有办法使这个二进制文件独立呢? 我记得在 Windows 平台和使用 .NET 时可以使用 ILMerge 来实现(但它使用的是 .dll 文件,而不是 .dylib)。


通常,如果您使用命令行编译器,则所有旧命令仍然有效。 dll、库和exe在结构上非常相似。 dll和exe之间唯一真正的区别是exe必须有一个main(),而dll则是可选的。 dll实际上是旧库的更新版本,其中dll最初与Window95一起使用。 旧库是obj的简单合并,其中每个方法都可以从可执行文件中调用。 dll只是在旧库格式(obj的合并)周围添加了一个新的包装器。 - jdweng
我不明白你的观点是什么。合并编译生成的文件并创建一个独立的可执行文件对我有什么帮助呢? 我甚至无法尝试使用ILMerge,因为我使用的是Mac电脑。 - Victor Castro
请参见 MSDN:https://msdn.microsoft.com/zh-cn/library/78f4aasd(v=vs.100).aspx - jdweng
@jdweng 这是一个关于OSX的问题。 - David Heffernan
@jdweng 我尝试使用 csc *.cs 进行编译,但是当我运行 ./Program.exe 时,终端返回一个错误:zsh: exec format error: ./Program.exe。该程序似乎没有为OSX编译。 - Victor Castro
1个回答

1
目前这是不可能的。.NET Core 仍然是一个模块化系统,通过部署自包含应用程序,你实际上会发布整个运行时的副本。虽然使用新的链接器(预览版)可以减小托管程序集的大小(或使用 ILMerge 合并所有托管程序集),但代码中仍然有按名称引用的本机资产(.dylib)文件。
有一个不同的运行时项目 - CoreRT - 旨在通过事先将托管部分编译为机器代码来创建单个本机可执行文件。该项目仍在开发中。

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