私はいくつかのクラスライブラリプロジェクトを持っているWebアプリケーションを持っています。以下のサンプルコード。
public static class LenderBL
{
static string LenderXml { get { return "MyPathHere"; } }
public static LenderColl GetLenders()
{
var serializer = new XmlSerializer(typeof(LenderColl));
using (XmlReader reader = XmlReader.Create(LenderXml))
{
return (LenderColl)serializer.Deserialize(reader);
}
}
}
通常、Server.MapPathを使用してプロパティLenderXmlのパスを取得しますが、クラスライブラリで使用すると、クラスライブラリプロジェクトのパスではなく、親ソリューションのパスが返されます。
クラスライブラリプロジェクト自体のパスを取得する方法はありますか?
前もって感謝します。
var Mappingpath = System.Web.HttpContext.Current.Server.MapPath("pagename.aspx");
お役に立てれば幸いです。
私が理解できるように、あなたは現在のアセンブリの場所が必要です
static public string CurrentAssemblyDirectory()
{
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
}
Server.MapPath
は常にWebルートのコンテキストで実行されます。したがって、あなたの場合、Webルートは親Webプロジェクトです。クラスライブラリ(アセンブリ)は個別のプロジェクトのように見えますが、実行時には、それらはすべてWebプロジェクトプロセスでホストされます。したがって、クラスライブラリにあるリソースについては、考慮すべきことがいくつかあります。
まず、クラスライブラリにリソースを保持することが理にかなっているかどうかを検討します。たぶん、Webプロジェクトにxml
ファイルがあり、クラスライブラリで参照するだけです。これは、MVCプロジェクトがWebプロジェクトでのビューを維持する方法と同等です。ただし、これはできないと思います。
次に、xml
ファイルのビルドプロパティを変更できます。プロパティでファイルをcontent
およびcopy-always
に変更した場合。ファイルはbinディレクトリにコピーされます。その後、ファイルにアクセスできるため、Server.MapPath
が機能するはずです。
3番目に、リソースを 埋め込みリソース にして、コードで参照できます。これは、構築されたアセンブリに対してすべてのリソースをローカルに保つ方法です。
お役に立てれば。