【问题标题】:Compile into only one independent binary file只编译成一个独立的二进制文件
【发布时间】:2017-11-07 22:29:22
【问题描述】:

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

它会创建一个运行良好的二进制文件,但是如果我将此文件移动到其他位置而没有同一目录中的其他文件,则程序将无法运行:

A fatal error occurred, the required library libhostfxr.dylib could not be found at /Users/me/

有没有办法让二进制文件独立? 我记得在 Windows 和 .NET 上可以使用 ILMerge(但它使用 .dll 文件,而不是 .dylib

【问题讨论】:

  • 如果您使用命令行编译器,通常所有旧命令仍然有效。 dll、library 和 exe 在结构上都非常相似。 dll 和 exe 之间唯一真正的区别是 exe 必须具有 main() 而 dll 是可选的。 dll 实际上是旧库的较新版本,其中 dll 首次用于 Window95。旧库是 obj 的简单合并,其中每个方法都可以从可执行文件中调用。 dll 只是在旧库格式(obj 的合并)周围添加了一个新包装器。
  • 我不明白你的意思。它如何帮助我合并编译生成的文件并只创建一个独立的可执行文件?我什至无法尝试使用 ILMerge,因为我使用的是 Mac。
  • @jdweng 这是一个 OSX 问题
  • @jdweng 我尝试使用csc *.cs 进行编译,当我运行./Program.exe 时,终端返回错误:zsh: exec format error: ./Program.exe。该程序似乎不是为 OSX 编译的

标签: c# .net macos .net-core


【解决方案1】:

目前这是不可能的。 .NET Core 仍然是一个模块化系统,通过部署一个自包含的应用程序,您基本上可以交付整个运行时的副本。虽然可以使用新的链接器(预览版)来减小托管程序集的大小(或使用 ILMerge 合并所有托管程序集),但仍然存在按名称引用的本机资产(.dylib)文件代码。

有一个不同的运行时项目 - CoreRT - 旨在通过提前将托管部分编译为机器代码来创建单个本机可执行文件。该项目仍在开发中。

【讨论】:

    猜你喜欢
    • 2017-02-20
    • 2017-04-25
    • 2015-10-29
    • 1970-01-01
    • 2019-07-17
    • 2022-01-24
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多