Как мне получить путь к сборке, в которой находится код?

import java.util.Scanner;
public class Time{
    public static void main(String[]args){
        int totMins=0;
        int hours=0;
        int mins=0;
    Scanner sc= new Scanner(System.in);
    System.out.println("Enter the time in mins: ");
        totMins= sc.nextInt();
        hours=(int)(totMins/60);
        mins =(int)(totMins%60);
        System.out.printf("%d:%d",hours,mins);
    }
}
725
задан bluish 16 June 2014 в 13:00
поделиться

14 ответов

Я определил следующее свойство, поскольку мы часто используем это в поблочном тестировании.

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}

Assembly.Location свойство иногда дает Вам некоторые забавные результаты при использовании NUnit (где блоки, выполненные от временной папки), таким образом, я предпочитаю использовать CodeBase, который дает Вам, путь в формате URI, тогда UriBuild.UnescapeDataString удаляет File:// вначале, и GetDirectoryName изменения это к нормальному формату окон.

969
ответ дан Mikael Engver 16 June 2014 в 13:00
поделиться
string path = Path.GetDirectoryName(typeof(DaoTests).Module.FullyQualifiedName);
1
ответ дан Jesse C. Slicer 16 June 2014 в 13:00
поделиться

Текущий каталог, где Вы существуете.

Environment.CurrentDirectory;  // This is the current directory of your application

при копировании .xml файла со сборкой необходимо найти его.

или

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof(SomeObject));

// The location of the Assembly
assembly.Location;
6
ответ дан David Basarab 16 June 2014 в 13:00
поделиться
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var assemblyPath = assembly.GetFiles()[0].Name;
var assemblyDir = System.IO.Path.GetDirectoryName(assemblyPath);
7
ответ дан Pierre Arnaud 16 June 2014 в 13:00
поделиться
AppDomain.CurrentDomain.BaseDirectory

работает с интерфейсом MbUnit.

11
ответ дан bluish 16 June 2014 в 13:00
поделиться

Я подозреваю, что реальная проблема здесь - то, что Ваш исполнитель тестов копирует Ваш блок в различное местоположение. Нет никакого пути во времени выполнения для сообщения, где блок был скопирован с, но можно, вероятно, зеркально отразить переключатель, чтобы сказать исполнителю тестов выполнять блок от того, где это а не скопировать его в теневой каталог.

Такой переключатель, вероятно, будет отличаться для каждого исполнителя тестов, конечно.

Вы рассмотрели встраивание Ваших данных XML как ресурсы в Вашей опытной сборке?

11
ответ дан Curt Hagenlocher 16 June 2014 в 13:00
поделиться

Что относительно этого:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
14
ответ дан huseyint 16 June 2014 в 13:00
поделиться

Это должно работать, если блок не , тень скопировала :

string path = System.Reflection.Assembly.GetExecutingAssembly().Location
31
ответ дан Pierre Arnaud 16 June 2014 в 13:00
поделиться

Это помогает?

//get the full location of the assembly with DaoTests in it
string fullPath = System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location;

//get the folder that's in
string theDirectory = Path.GetDirectoryName( fullPath );
305
ответ дан Keith 16 June 2014 в 13:00
поделиться

Я использовал блок. CodeBase вместо Местоположения:

Assembly a;
a = Assembly.GetAssembly(typeof(DaoTests));
string s = a.CodeBase.ToUpper(); // file:///c:/path/name.dll
Assert.AreEqual(true, s.StartsWith("FILE://"), "CodeBase is " + s);
s = s.Substring(7, s.LastIndexOf('/') - 7); // 7 = "file://"
while (s.StartsWith("/")) {
    s = s.Substring(1, s.Length - 1);
}
s = s.Replace("/", "\\");

Это работало, но я больше не уверен, что это на 100% корректно. Страница в http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx говорит:

"CodeBase является URL к месту, где файл был найден, в то время как Местоположение является путем, где это было на самом деле загружено. Например, если блок был загружен с Интернета, его CodeBase может запуститься с "http://", но его Местоположение может запуститься с "C:\". Если бы файл был скопирован с тени, Местоположение было бы путем к копии файла в dir теневой копии It’s, также хороший, чтобы знать, что CodeBase, как гарантируют, не будет установлен для блоков в GAC. Местоположение будет всегда устанавливаться для блоков, загруженных из диска, как бы то ни было. "

Вы можете хотеть использовать CodeBase вместо Местоположения.

6
ответ дан dan gibson 16 June 2014 в 13:00
поделиться

Я полагаю, что это работало бы на любой вид приложения:

AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
4
ответ дан 22 November 2019 в 21:28
поделиться

Here is a VB.NET port of John Sibly's code. Visual Basic is not case sensitive, so a couple of his variable names were colliding with type names.

Public Shared ReadOnly Property AssemblyDirectory() As String
    Get
        Dim codeBase As String = Assembly.GetExecutingAssembly().CodeBase
        Dim uriBuilder As New UriBuilder(codeBase)
        Dim assemblyPath As String = Uri.UnescapeDataString(uriBuilder.Path)
        Return Path.GetDirectoryName(assemblyPath)
    End Get
End Property
7
ответ дан 22 November 2019 в 21:28
поделиться

То же, что и ответ Джона, но чуть менее подробный метод расширения.

public static string GetDirectoryPath(this Assembly assembly)
{
    string filePath = new Uri(assembly.CodeBase).LocalPath;
    return Path.GetDirectoryName(filePath);            
}

Теперь вы можете сделать:

var localDir = Assembly.GetExecutingAssembly().GetDirectoryPath();

или, если хотите:

var localDir = typeof(DaoTests).Assembly.GetDirectoryPath();
66
ответ дан 22 November 2019 в 21:28
поделиться

Это так просто:

var dir = AppDomain.CurrentDomain.BaseDirectory;
306
ответ дан 22 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: