我需要检索使用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
,而不会有任何先行路径。
可能它只显示束内的相对路径。有什么方法可以让我自己找到这个包的路径吗?..
答案 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。