在Mono C#CLI应用程序中获取捆绑包的路径

本文关键字:路径 获取 Mono C#CLI 应用程序 | 更新日期: 2023-09-27 18:29:38

我需要检索使用mkbundle --static生成的应用程序可执行文件的完整路径(最多到目录)。这是我在OSX上测试的CLI应用程序,假设可执行文件位于/usr/local/bin/

可能会更加复杂(但我真的不知道),因为我想从任何目录运行该实用程序,所以我将上述路径添加到$PATH环境变量中(在这种情况下,它已经存在)。

现在,假设应用程序是在~/dir1/dir2/时启动的,并假设它打印Application.StartupPath。这产生了路径CCD_ 6。相反,我希望始终检索启动应用程序的real目录,即/usr/local/bin/

有没有办法实现这一点(最好是以独立于平台的方式)?

我使用的Xamarin Studio配置了Mono/.NET 4.5和C#6.0。

更新:获取typeof(Program).Assembly.Location也没有多大帮助。

我的意思是,当我只运行正常的应用程序可执行文件(在构建过程中生成)时,它工作得很好。

然而,如果我运行一个用mkbundle --static制作的捆绑包,Location只提供了可执行文件名App.exe,而没有任何先前的路径。

可能它只是显示束内的相对路径。有没有什么方法可以找到包裹本身的路径?。。

在Mono C#CLI应用程序中获取捆绑包的路径

我发现唯一可靠的方法(可能不是最快的方法)是通过Process:

Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

对于在程序集中定义的类型(它是应用程序的一部分),您可以通过执行以下操作来找到它的位置:

string location = typeof(Foo).Assembly.Location;

这将为您提供.dll或.exe的完整路径,具体取决于Foo类型的定义位置。如果您只需要该目录,则可以使用Path.GetDirectoryName。

string directory = System.IO.Path.GetDirectoryName(location);

以上内容应适用于Mono和Windows。