【发布时间】: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肯定会影响它。将单个文件版本提取到磁盘,然后执行提取的可执行文件。见thePublishSingleFiledesign doc。 -
感谢您的澄清! @OmairMajid