Все найденные мной решения для получения пути к текущему файлу не работают в двух ситуациях: при запуске юнит-тестов из другого проекта в солюшене и при обращении к проекту из другого проекта по ссылке.
При запуске модульных тестов пути, сгенерированные ими, относятся к тестовому проекту в моем решении, и это приводит к тому, что путь, который я создаю для доступа к некоторым ресурсам, неверен:
System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
System.AppDomain.CurrentDomain.BaseDirectory;
System.Environment.CurrentDirectory;
System.IO.Directory.GetCurrentDirectory();
Environment.CurrentDirectory;
Thread.GetDomain().BaseDirectory;
Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
System.IO.Path.GetFullPath(@"..\..\");
Все они выводят неправильный проект при запуске модульных тестов: C:\Users\Me\source\MySolution\TestProject\bin\Debug
Мне нужно, чтобы он выводил тот же путь к правильному проекту:
C:\Users\Me\source\MySolution\CoolProject\classes\somefile.cs
или
C:\Users\Me\source\MySolution\CoolProject\классы
или
C:\Users\Me\source\MySolution\CoolProject\
или
C:\Users\Me\source\MySolution\CoolProject\bin\debug
Как сгенерировать путь к текущему файлу или хотя бы к проекту, в котором находится код?
На самом деле, я бы предложил перейти в корневую папку вашего решения, затем через имя сборки (которое совпадает с именем проекта) вы можете указать путь к вашему проекту... например: C:\Users\ Me\Source\MySolution\LOADED_ASSEMBLY_NAME\thefileyouwant.cs
@Эндрю, чего ты пытаешься добиться с помощью этих файлов *.cs в своих тестах?
Возможный дубликат Как я могу получить имя файла текущего рабочего файла cs и имя текущего класса
@StenPetrov Просто нужен базовый путь, который я могу указать на папку с некоторыми активами. Работал нормально, пока не запустил код через модульные тесты... и в подмодуле.
@Andrew, если для ваших тестов требуется ввод файла, вы можете пометить файлы «Содержимое» или «Встроенный ресурс» и найти их в текущей папке или внутри сборки с помощью GetResourceStream. Обход структуры папок не является обычным делом для этой потребности.
@StenPetrov Правильно, тесты - это не те, которым нужны файлы, метод, который я вызываю из теста (в другом проекте), нуждается в файле, но путь к файлу был сгенерирован неправильно при запуске через модульные тесты.





*.cs теряется во время компиляции. Вы можете сохранить его, имея метод с некоторыми параметрами по умолчанию и [CallerMemberName] для метода, [CallerFilePath] для имени файла и [CallerLineNumber] для строки, из которой вызывается ваш метод, затем верните одно из полученных значений.
public string GetMyFilePath([CallerFilePath] string callerFilePath = null) => return callerFilePath;
вызовите его без параметров, и он вернет путь к файлу, из которого вы звоните.... до тех пор, пока он находится на той же машине, где был создан код
Вы также можете получить путь к dll из Assembly.GetExecutingAssembly().CodeBase. Это дает вам полный путь к dll с file:/// впереди, но не имя исходного файла.
Было бы хорошо уточнить вашу цель, может быть другой и лучший способ сделать то, что вы пытаетесь сделать.
Кажется, это работает и на самом деле является лучшим вариантом, я приму его, если ничего другого не появится.
C# компилируется, а не интерпретируется. Нет такой вещи, как «текущий файл»; есть такое понятие как текущая сборка. Для скомпилированного кода было бы сложно (невозможно?) узнать, где находится исходный код.