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

时间:2016-01-09 07:59:14

标签: c# .net reflection path mono

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

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

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

有没有办法实现这一目标(最好是以平台无关的方式)?

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

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

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

但是,如果我运行使用mkbundle --static制作的捆绑包,则Location只会提供可执行文件名App.exe,而不会有任何先行路径。

可能它只显示束内的相对路径。有什么方法可以让我自己找到这个包的路径吗?..

2 个答案:

答案 0 :(得分:3)

我发现可靠的唯一可能(可能不是最快的方式)是通过<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <ProjectGuid>{A1DE4897-3BBB-4F67-8D97-662793603C18}</ProjectGuid> <OutputType>Library</OutputType> <AppDesignerFolder>Properties</AppDesignerFolder> <RootNamespace>Dummy.Sonar</RootNamespace> <AssemblyName>Dummy.Sonar</AssemblyName> <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> <FileAlignment>512</FileAlignment> <SccProjectName>SAK</SccProjectName> <SccLocalPath>SAK</SccLocalPath> <SccAuxPath>SAK</SccAuxPath> <SccProvider>SAK</SccProvider> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <DebugSymbols>true</DebugSymbols> <DebugType>full</DebugType> <Optimize>false</Optimize> <OutputPath>bin\Debug\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <DebugType>pdbonly</DebugType> <Optimize>true</Optimize> <OutputPath>bin\Release\</OutputPath> <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> <TreatWarningsAsErrors>true</TreatWarningsAsErrors> <CodeAnalysisIgnoreGeneratedCode>true</CodeAnalysisIgnoreGeneratedCode> <NoWarn>2210</NoWarn> </PropertyGroup> <ItemGroup> <Reference Include="System" /> <Reference Include="System.Core" /> <Reference Include="System.Xml.Linq" /> <Reference Include="System.Data.DataSetExtensions" /> <Reference Include="Microsoft.CSharp" /> <Reference Include="System.Data" /> <Reference Include="System.Net.Http" /> <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> <Folder Include="Properties\" /> </ItemGroup> <ItemGroup> <Content Include="**\*.sql" /> </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. <Target Name="BeforeBuild"> </Target> <Target Name="AfterBuild"> </Target> --> </Project>

Process

答案 1 :(得分:1)

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

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

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

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

以上内容适用于Mono以及Windows。