【问题标题】:Finding location of executable in dotnet core在 dotnet core 中查找可执行文件的位置
【发布时间】:2019-11-19 15:33:53
【问题描述】:

我的实际目标是读取可执行文件父目录中的文件。我首先尝试通过执行以下操作来解决此问题。这工作得很好,但是在我的 macbook 上的 Rider 中运行时,exeDir 解析为/usr/local/share

var exeDir = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule?.FileName);
var parentDir = Directory.GetParent(exeDir).FullName;

原因是 Rider 通过这样做来执行应用程序

/usr/local/share/dotnet/dotnet /Users/thomas/RiderProjects/ConsoleApp1/ConsoleApp1/bin/Debug/netcoreapp3.0/ConsoleApp1.dll

导致Process.GetCurrentProcess().MainModule?.FileName 导致/usr/local/share/dotnet/dotnet


在做了一些研究后,我尝试使用其中一种来代替

System.Reflection.Assembly.GetEntryAssembly().Location
System.Reflection.Assembly.GetExecutingAssembly().Location

在 Windows 主机上运行时,我没有按预期报告 C:\dummyservice,而是得到以下结果:

C:\Users\THOMAS~1\AppData\Local\Temp.net\worker\otstv4uv.ifx\worker.dll

这是因为 dotnet 如何解包捆绑的应用程序,即。 PublishSingleFile=true。感谢 cmets 中的@OmairMajid 指出这一点。

我仍在寻找有关如何以独立于平台的方式处理此问题的建议。


总结一下,这就是我想要实现的。 dotnet core 3.0 worker 应用程序与不同的应用程序捆绑在一起。

C:\MyApp
C:\MyApp\config.ini
C:\MyApp\... # other files (executables, …)
C:\MyApp\Worker\Worker.exe # installed as service, want to read config.ini above

【问题讨论】:

  • 是的,PublishSingleFile=true 肯定会影响它。将单个文件版本提取到磁盘,然后执行提取的可执行文件。见the PublishSingleFile design doc
  • 感谢您的澄清! @OmairMajid

标签: c# .net .net-core


【解决方案1】:

请试试这个,在 Win 中也可以在 .net core 中运行

AppDomain.CurrentDomain.BaseDirectory

[更新] PublishSingleFIle=true 在 Win 上也有同样的问题,给定的目录将是 C:\Temp.net\ConsoleApp\uxohf4qt.col\

.net core github上有一个有趣的讨论 https://github.com/dotnet/designs/pull/52

【讨论】:

  • 当使用 PublishSingleFile=true 发布时,这也会导致 `C:\Users\THOMAS~1\AppData\Local\Temp\.net\worker\otstv4uv.ifx`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 2017-02-25
相关资源
最近更新 更多