c# - Mono 使用错误的当前目录执行程序

标签 c# linux path mono raspberry-pi

我有一个奇怪的问题。我在 C# .NET 4.6 中编写了一个自定义垃圾邮件过滤器供个人使用。我把这个程序放到了我的 Raspberry Pi 上。

我对该程序进行了多次测试,一切正常,但是当我创建一个 cronjob 时,我注意到该程序从不写入日志。

当我再次开始测试时,我发现问题是,当我从程序的基本目录启动程序时,它工作正常:

> cd path/to/program
> mono program.exe

但是当我从另一个具有绝对路径的目录启动它时:

> mono /absolute/path/to/program/program.exe

所需文件的相对路径出错。

例如,如果我在/home 目录中,我的程序在/home/user/program 目录中,我运行这个:

> mono /home/user/program/program.exe

我得到“找不到文件”/home/xyz.txt“”

我尝试使用 Path.GetFullPath()Environment.CurrentDirectory 从程序中的相对路径创建绝对路径,但没有任何改变。

所以我的问题是:是否有任何选项可以在当前目录正确的另一个目录中运行单声道程序?

我知道 bash 脚本可以执行我的第一个解决方案(cd 然后是 mono)并且它可以在 cron 中使用,但我想知道是否有更简单的解决方案。

最佳答案

当前目录是正确的,它是您启动进程的当前目录,并且该进程是mono大小写,不是单声道正在加载的基于 CIL 的程序集的位置。

听起来您想要的是 ExecutingAssembly 的路径。

这适用于 x-plat (Windows/Linux/macOS):

string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
Console.WriteLine(path);

引用:https://msdn.microsoft.com/en-us/library/aa457089.aspx

关于c# - Mono 使用错误的当前目录执行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39601742/

相关文章:

linux - 是否可以在无需手动输入(密码)的情况下在自启动设备上实现完整的设备加密?

macos - 执行任何终端命令时获取 `No such file or directory`(由 VMware Fusion 引起)

c# - MsiGetShortcutTarget MSI LNK 文件不返回组件 ID

c# - 带有客户端证书的 HttpWebRequest 总是出现错误 "The request was aborted: Could not create SSL/TLS secure channel."

c# - 使用 Linq 查找重复行

path - 如何在系统范围内更改 RubyMine 的 PATH?

java - 为所有用户创建文件夹

c# - 捕获WPF按钮时出错

java - UTF-8 规范化重音编码形式之间的冲突

linux - 如何在 Linux 的用户空间库中捕获系统调用?