14

さて、ここに質問があります。2つのプロジェクトがあります。1つはC#コンソールで、もう1つはクラスライブラリです。コンソールアプリからクラスライブラリメソッドにアクセス/呼び出しています。クラスライブラリプロジェクト内にFilesというフォルダがあります。

クラスライブラリのファイルフォルダのパスを取得する必要がありますが、使用するときはいつでも

System.IO.Directory.GetCurrentDirectory();

Environment.CurrentDirectory; 

メソッドを呼び出すために使用しているコンソールプロジェクトのパスを教えてくれます。

上記の方法は私に次のような道を与えています

C:\\ConsolePro\\bin\\Debug

しかし、クラスライブラリプロジェクトのパスが必要です

C:\\ClassLibPro\\bin\\Debug

お知らせ下さい

4

9 に答える 9

11

コードがコンパイルされて実行されると、「プロジェクトパス」は意味を持ちません。決定できるのは、コンパイルされたアセンブリのファイルの場所だけです。また、コンソールプロジェクトが、プロジェクトリファレンスを介してではなく、ビルドされた「クラスライブラリ」DLLを直接参照しているかどうかを確認することしかできません。

次に、Reflectionを使用して、次のようなアセンブリパスを取得できます。

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

Directory.GetParent(Directory.GetCurrentDirectory())数回使用してより高いレベルのディレクトリを取得し、その最後にlibディレクトリのパスを追加できるはずです。

于 2012-06-27T02:59:03.347 に答える
4

問題は次のとおりです。

コンソールプロジェクトにはDLLファイル参照があるため、DLLを使用して任意のメソッドを呼び出しています。現時点では、コンソールプロジェクトのbinディレクトリにあるクラスライブラリプロジェクトのDLLの場所を返していますが、クラスライブラリプロジェクトの物理的な場所はわかりません。

つまり、基本的には同じプロジェクトパスを返します。この問題を解決するには、両方のプロジェクトを同じディレクトリに移動する必要があります。

于 2012-06-27T03:33:30.883 に答える
3

別のアセンブリからクラスライブラリをロードする場合。

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

string PathToClassLibPro = Path.GetDirectoryName( Path);

{LibraryClassName}ライブラリのクラス名に置き換えます。

于 2012-06-27T03:01:27.763 に答える
3

私はあなたを正しく理解することを願っています:

Path.GetDirectoryName(typeof(Foo.MyFooClass).Assembly.Location);
于 2012-06-27T08:40:19.183 に答える
1

2つのオプションのいずれかをお勧めします。

  1. ファイルが小さい場合は、それらをクラスライブラリに含め、必要に応じて一時的な場所にストリーミングします

  2. 他のオプションは、ビルド中にファイルを出力ディレクトリにコピーし、そのように使用することです。複数の共有プロジェクトの場合は、アセンブリをコピーしてその場所から実行する共通のbinフォルダーを用意するのが最適です。

于 2012-06-27T04:50:52.470 に答える
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 に答える
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 に答える