8

2つのプロジェクトを含むソリューションがあります。1つのプロジェクトはすべてのデータ処理を実行するためのものであり、もう1つのプロジェクトであるスタートアッププロジェクトはすべてのWeb処理を実行するためのものです。

解決

ここで、最初にプロジェクトのルートディレクトリを取得して、TaskManagerHelpersクラスからTasksDataBase.xmlを取得します。しかし、私が取得するのはTaskManager.Webルートディレクトリだけです。(TaskManager.Web内のコントローラーからTaskManagerHelpers.cs内のメソッドを呼び出します)

同じプロジェクトのクラスにいるときにTaskManager.Dataルートディレクトリを取得するにはどうすればよいですか?

私はこれらの方法と同様の方法で試しました。

  • HttpContext.Current.Request.PhysicalApplicationPath;
  • System.IO.Path.GetFullPath();
  • AppDomain.CurrentDomain.BaseDirectory;

前もって感謝します!

4

4 に答える 4

8

1つの可能性はembed the XML file into the assembly、クラスライブラリを作成し、それをWebアプリケーションのリソースとして読み取ることです。WebアプリケーションをWebサーバーに公開すると、パッケージに含まれるのはこのWebアプリケーションのファイルだけになることに注意してください。このWebアプリケーションが含まれていたVisualStudioソリューションに組み込まれている可能性のある一部のプロジェクトとは物理的な関係はありません。

GetManifestResourceStream参照されているアセンブリから埋め込みXMLを読み取ることができるメソッドを確認できます。

次に例を示します。

// you could use any type from the assembly here
var assembly = typeof(TaskManagerHelper).Assembly;
using (var stream = assembly.GetManifestResourceStream("TaskManager.Data.DataBase.TasksDataBase.xml"))
using (var xmlReader = XmlReader.Create(stream))
{
    // ... do something with the XML here
}

ただし、ファイルはアセンブリに埋め込まれているため、変更できないことに注意してください。読み取り専用です。それを変更する必要がある場合、別のアプローチは、このファイルをWebアプリケーションにコピーすることです。たとえば、適切な場所はApp_Data特別なフォルダです。この場所にXMLファイルをコピーするコンパイル後の手順を設定することもできます。

そして、それを簡単に参照できます。

string xmlFile = HostingEnvironment.MapPath("~/App_Data/TasksDataBase.xml");
using (var xmlReader = XmlReader.Create(xmlFile))
{
    // ... do something with the XML here
}

この場合、XMLファイルは物理的にWebアプリケーションの一部であり、ハードドライブ上にあるため、変更することもできます。

于 2013-01-25T21:19:42.070 に答える
4

2つのプロジェクトが開発中に同じフォルダーツリーに配置されているという理由だけで、実行時にそれらが配置される場所については何も述べていません。それが別のマシン上にある可能性は完全にあります。

「いいえ」とあなたは言います。それらは間違いなく同じc:\inetpubツリーの同じマシン上にあります。それは本当かもしれませんが、それはあなたの方針であり、要件ではありません。

それらがどこにあるかについてハードポリシーを確立しようとしている場合は、それをコードにハードコーディングできます。

于 2013-01-25T21:30:06.947 に答える
1

Webプロジェクトを実行している場合、参照されているすべてのdllファイルがbinディレクトリにコピーされ(GACにない場合)、そこから使用されます。別のプロジェクトへの参照を追加するかどうかに関係なく、VisualStudioは最初にそれをコンパイルしてからコンパイルします。 Webプロジェクトのbinフォルダーにコピーします。xmlファイルをコンテンツ(コンパイルアクション)としてマークし、常にコピーオプションを使用して、常にbinディレクトリにコピーすることができます....問題は、binフォルダーの外でこのファイルを探すことがあるということですが、あなたはこれを処理することができます。

于 2013-01-25T21:26:48.170 に答える
1

XMLファイルを右クリックしてプロパティを選択し、[出力ディレクターにコピー]を[コピーしない]以外の設定のいずれかに変更します。これにより、ファイルが他のプロジェクト出力と一緒に\bin\フォルダーに配置されます。AppDomain.CurrentDomain.BaseDirectoryその後、ベースパスとして使用できます

于 2013-01-25T21:25:20.807 に答える