【问题标题】:Get the path to the bundle in Mono C# CLI application在 Mono C# CLI 应用程序中获取包的路径
【发布时间】:2016-04-13 23:12:20
【问题描述】:

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

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

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

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

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

更新: 获取typeof(Program).Assembly.Location 也无济于事。

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

但是,如果我运行使用 mkbundle --static 制作的包,Location 只会给出可执行文件名称 App.exe,而没有任何先前的路径。

可能它只是显示包内的相对路径。有什么方法可以让我获得捆绑包本身的路径吗?..

【问题讨论】:

    标签: c# .net reflection path mono


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      使用在作为应用程序一部分的程序集中定义的类型,您可以通过以下操作找到它的位置:

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

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

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

      以上内容应该适用于 Mono,也适用于 Windows。

      【讨论】:

      • 谢谢马特。如果我运行mono app.exe,它就可以工作,但当我运行使用mkbundle --static 创建的包时就不行。在这种情况下,它只是显示app.exe,也许它是相对于捆绑包的路径?..仍然无法弄清楚如何获取捆绑包的路径,或者是否有可能。
      • 我更改了问题主体以反映对问题的新理解。你知道什么对我的情况有帮助吗?
      • 抱歉,不知道。我怀疑您将不得不使用native api 来查找当前可执行文件的路径。
      猜你喜欢
      • 2011-09-08
      • 1970-01-01
      • 2014-11-22
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多