【问题标题】:Original assembly location in .NET 5.0 Linux with Single-File Executable具有单文件可执行文件的 .NET 5.0 Linux 中的原始程序集位置
【发布时间】:2021-12-04 00:48:31
【问题描述】:

我在 Windows 上找到了许多与 .NET Core 3.1 和 .NET 5.0 相关的答案,但到目前为止,我还无法找到如何在 .NET Core 下获取原始程序集位置em>Linux 使用单文件可执行文件时。鉴于系统行为不同,我认为这可能是 .NET 5 中的一个错误,但同时我需要一个解决方法。请注意,在我的场景中,当前目录是 not 原始可执行文件所在的位置,即使我不更改它,我也无法控制它(无论如何这是一个 hack——当前目录的目的完全不同)。以下是此场景下测试程序的实际输出,其中包含我迄今为止能够找到的所有其他帖子中建议的属性和功能:

Directory.CurrentDirectory()=/home/ec2-user/source
typeof(Program).Assembly.Location=/root/.net/Test/jwaxs3pc.bdp/Test.dll
typeof(Program).Assembly.GetFiles() [0].Name=/root/.net/Test/jwaxs3pc.bdp/Test.dll
typeof(Program).Assembly.GetName().CodeBase=file:///root/.net/Test/jwaxs3pc.bdp/Test.dll
AppContext.BaseDirectory=/root/.net/Test/jwaxs3pc.bdp/
Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName=/root/.net/Test/jwaxs3pc.bdp

我需要找到原始代码位置,而不是单文件可执行文件解压到的位置。我如何获得这些最基本的信息?有没有一种独立于平台和设置的方式来做到这一点(真的应该有)?

【问题讨论】:

    标签: .net linux .net-core .net-5


    【解决方案1】:

    当您将应用发布为单个可执行文件时,某些与 Assembly 相关的 API 将无法工作,这不是错误。

    这里记录了: https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file#api-incompatibility

    您将在该表中看到Assembly.Location 在单个可执行文件中运行时将始终返回空字符串。 按照该文档中的建议,您可以调用 Environment.GetCommandLineArgs() 并计算字符串数组结果中第一项的值。

    【讨论】:

    • 嗯。看起来有两个错误然后。如果您阅读我的输出,Assembly.Location 确实 not 实际上返回一个空字符串,而 AppContext.BaseDIrectory 确实 not 返回该页面建议的可执行文件的路径。我想我真的处于最前沿。该页面的日期为 2021 年 10 月 15 日,即我提出问题的前一天,并且在我查找时不会被编入索引。感谢 GetCommandLineArgs() 解决方法。
    • @James 不客气 :) 很高兴我的回答对您有所帮助。
    猜你喜欢
    • 2015-12-01
    • 2018-11-27
    • 2012-12-31
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2016-11-24
    • 1970-01-01
    相关资源
    最近更新 更多