14

好的,这是问题。我有两个项目,一个是 C# 控制台,另一个是类库。我正在从控制台应用程序访问/调用类库方法。类库项目中有一个名为 Files 的文件夹。

我需要获取类库文件夹的路径,但每当我使用

System.IO.Directory.GetCurrentDirectory();

Environment.CurrentDirectory; 

它给了我用来调用该方法的控制台项目的路径。

以上方法给了我这样的路径

C:\\ConsolePro\\bin\\Debug

但我需要类库项目的路径

C:\\ClassLibPro\\bin\\Debug

请指教

4

9 回答 9

11

一旦代码编译并运行,“项目路径”就没有意义了。您只能确定已编译程序集的文件位置。如果您的控制台项目直接引用构建的“类库”DLL,而不是通过项目引用,您只能按照您的要求进行操作。

然后,您可以利用反射来获得装配路径,例如;

string path = Assembly.GetAssembly(typeof (SomeClassInOtherProject)).Location;
于 2012-06-27T03:04:58.657 回答
4

我相信问题是:

由于控制台项目具有 DLL 文件引用,因此它使用 DLL 来调用任何方法。此时它返回的是类库项目的DLL位置,它位于控制台项目的bin目录中,它不知道类库项目的物理位置。

所以本质上它是返回相同的项目路径。为了解决这个问题,我必须将两个项目移动到同一个目录中。

于 2012-06-27T03:33:30.883 回答
4

您应该能够使用Directory.GetParent(Directory.GetCurrentDirectory())几次来获取更高级别的目录,然后将 lib 目录的路径添加到该目录的末尾。

于 2012-06-27T02:59:03.347 回答
3

我希望我能正确理解你:

Path.GetDirectoryName(typeof(Foo.MyFooClass).Assembly.Location);
于 2012-06-27T08:40:19.183 回答
3

如果您从另一个程序集中加载类库。

string Path = System.Reflection.Assembly.GetAssembly(typeof({LibraryClassName})).Location;

string PathToClassLibPro = Path.GetDirectoryName( Path);

替换{LibraryClassName}为您的库的类名。

于 2012-06-27T03:01:27.763 回答
1

我会推荐两个选项之一。

  1. 如果文件很小,请将它们包含在类库中,并在需要时将它们流式传输到临时位置

  2. 其他选项是在构建期间将文件复制到输出目录并以这种方式使用它们。在多个共享项目的情况下,最好有一个公共 bin 文件夹,您可以将程序集复制到该位置并从该位置运行。

于 2012-06-27T04:50:52.470 回答
1

我也遇到了这个确切的问题,我无法访问命名空间的 bin/debug 文件夹中的文件。我的解决方案是使用Split()然后构造一个新字符串来操作字符串,该字符串是我在命名空间中拥有的 json 文件的绝对路径。

private static string GetFilePath()
        {            
            const char Escape = '\\'; //can't have '\' by itself, it'll throw the "Newline in constant" error
            string directory = Environment.CurrentDirectory;
            string[] pathOccurences = directory.Split(Escape);            
            string pathToReturn = pathOccurences[0] + Escape; //prevents index out of bounds in upcoming loop
            for(int i = 1; i < pathOccurences.Length; i++)
            {
                if (pathOccurences[i] != pathOccurences[i - 1]) //the project file name and the namespace file name are the same
                    pathToReturn += pathOccurences[i] + Escape;
                else
                    pathToReturn += typeof(thisClass).Namespace + Escape; //In the one occurrence of the duplicate substring, I replace it with my class Namespace name
            }
            return pathToReturn + "yourFile.json";
        }

我个人不喜欢这个解决方案,但这是我能想到的唯一答案。

于 2020-09-27T18:24:22.423 回答
1

尽管我找不到一个好的解决方案,但我使用了这个技巧:只要你想回到你的理想路径,你应该添加Directory.GetParent()而不是...

  Directory.GetParent(...(Directory.GetParent(Directory.GetCurrentDirectory()).ToString()...).ToString()
于 2015-10-28T09:14:19.453 回答
1

我使用以下方法在运行时获取当前项目路径:

public static class ProjectInfo {
   public static string appDirectory = AppDomain.CurrentDomain.BaseDirectory;
   public static string projectPath = appDirectory.Substring(0, appDirectory.IndexOf("\\bin"));
}
于 2018-12-23T11:48:58.130 回答