【问题标题】:How to get the solution path in c#如何在c#中获取解决方案路径
【发布时间】:2018-06-13 04:06:26
【问题描述】:

我需要获取解决方案文件 (.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 它可以工作!

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

【问题讨论】:

  • 解决方案文件 (.sln) 不会在生产计算机上。您不能为此提供通用解决方案。
  • 为什么项目中的代码需要知道解决方案文件夹的路径?我怀疑您正在尝试解决错误的问题。请说明您实际想要实现的目标,而不是您尝试如何实现它。
  • @jmcilhinney 我正在尝试使用按钮从我的项目中执行 .exe。带有 .exe 的文件夹位于解决方案文件夹中。这就是为什么我需要路径。
  • 这没有任何意义。将应用程序部署到另一台计算机后,就应用程序而言,解决方案文件夹和项目文件夹不再存在。如果您的应用程序安装在用户的“程序文件”文件夹中,解决方案文件夹在哪里?如果您的应用程序想要访问文件,那么它们应该位于程序文件夹下,您可以使用Application.StartupPath 获得,或者标准位置,您可以使用Environment.GetFolderPath 获得。

标签: c# visual-studio path


【解决方案1】:

在 Visual Studio 2019 中使用 EnvDTE100 NuGet 包获得正确解决方案路径的正确方法对我有用。

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

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

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);
        }
    }
}

【讨论】:

  • 请注意,我打开了几个解决方案,但遇到了一个问题,即这实际上获得了另一个解决方案的路径,而不是运行此代码的路径。
  • @junliantolovich 你是对的,打开了 2 个解决方案它不起作用,只适用于打开单个 VS 实例。
【解决方案2】:

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

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

【讨论】:

  • 这将适用于项目中的文件,但是,虽然我从未测试过它,但我认为它不适用于解决方案中的文件。鉴于一个解决方案可以包含多个项目,它将被复制到哪个输出文件夹?
  • 另外,GetCurrentDirectopry 是错误的选项。它应该是Application.StartupPath,假设是一个 WinForms 应用程序。默认情况下,进程的当前目录通常是程序文件夹,但不一定是,即使是,也有一些东西可以在会话期间更改当前目录。
  • 在文件名前加上分隔符也没有意义。使用 Path.Combine 的主要原因之一是,它将确保在部分路径之间使用一个分隔符,无论是否包含它们,也不包含它们。
猜你喜欢
  • 2013-01-09
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
相关资源
最近更新 更多