C# 如何在c语言中获得解决方案路径#

C# 如何在c语言中获得解决方案路径#,c#,visual-studio,path,C#,Visual Studio,Path,我需要获取解决方案文件(.sln)所在的路径。我试着用这句话: string startupPath = Path.Combine(Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName,"abc.txt"); // Read the file as one string. string text = System.IO.File.ReadAl

我需要获取解决方案文件(.sln)所在的路径。我试着用这句话:

string startupPath = Path.Combine(Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName,"abc.txt");

// Read the file as one string. 
string text = System.IO.File.ReadAllText(startupPath);
当我运行它时,我得到一个“未授权访问异常”。当我“手动”放置路径时:
C:\Users\yabej\source\repos\tutoriales\Proyecto 0.1

但是,我需要一个“自动”解决方案,以确保在不同的计算机上运行项目时路径正确

如果将文件(abc.txt)添加到解决方案中,那么在文件的属性中,可以将“复制到输出目录”设置为“始终复制”。确保生成操作设置为“无”。然后在构建过程中,它将被复制到与可执行文件相同的位置,您可以使用

var path = Path.Combine(Directory.GetCurrentDirectory(), "\\abc.txt");

在Visual Studio 2019中,使用EnvDTE100 NuGet软件包,获得正确解决方案路径的正确方法对我来说非常有效

澄清:仅适用于打开的单个VS实例(credits@junliantolovich)

确保为您的Visual Studio使用正确的ProgId


解决方案文件(.sln)将不在生产计算机上。您不能为此提供通用解决方案。为什么项目中的代码需要知道解决方案文件夹的路径?我怀疑你试图解决错误的问题。请解释您实际想要实现的目标,而不是如何实现。@jmcilhinney我正试图使用一个按钮从我的项目中执行一个.exe。包含.exe的文件夹位于解决方案文件夹中。这就是为什么我需要这条路。那真的没有意义。一旦将应用程序部署到另一台计算机上,解决方案文件夹和项目文件夹就不再存在。如果应用程序安装在用户的“程序文件”文件夹中,解决方案文件夹在哪里?如果您的应用程序想要访问文件,那么它们应该位于program文件夹下,您可以使用
application.StartupPath
获取该文件夹,或者位于标准位置,您可以使用
Environment.GetFolderPath
获取该文件夹。这将适用于项目中的文件,但是,尽管我从未测试过它,我认为它不适用于解决方案中的文件。考虑到一个解决方案可以包含多个项目,它将被复制到哪个输出文件夹?而且,
GetCurrentDirectopry
是错误的选项。它应该是
Application.StartupPath
,假设是WinForms应用程序。默认情况下,进程的当前目录通常是程序文件夹,但它不一定是,即使是,在会话期间也有可能更改当前目录。在文件名前面显式添加分隔符也没有意义。使用
Path.Combine
的一个主要原因是,它将确保在部分路径之间使用一个分隔符,无论其中一个、两个或两个是否包含它们。请注意,我有两个解决方案,遇到一个问题,这实际上得到了另一个解决方案的路径,而不是运行此代码的解决方案。@junliantolovich您是对的,打开了两个解决方案,但它不起作用,只在打开一个VS实例时起作用。
using System;
using EnvDTE80;
using System.IO;
using System.Runtime.InteropServices;

namespace Test
{
    public class Program
    {
        public static void Main()
        {
            var di = GetSolutionDirInfo();
            Console.WriteLine(di.FullName);
        }

        public static DirectoryInfo GetSolutionDirInfo()
        {
            // Use here the ProgId of your Visual Studio
            // VS 2010 ->  "VisualStudio.DTE.10.0"
            // VS 2012 ->  "VisualStudio.DTE.11.0"
            // VS 2013 ->  "VisualStudio.DTE.12.0"
            // VS 2015 ->  "VisualStudio.DTE.14.0"
            // VS 2017 ->  "VisualStudio.DTE.15.0"
            // VS 2019 ->  "VisualStudio.DTE.16.0"
            var progId = "VisualStudio.DTE.16.0";
            var dte2 = (DTE2)Marshal.GetActiveObject(progId);
            return Directory.GetParent(dte2.Solution.FullName);
        }
    }
}