web-dev-qa-db-ja.com

クラスライブラリプロジェクト内でServer.MapPathを使用する方法

私はいくつかのクラスライブラリプロジェクトを持っている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のパスを取得しますが、クラスライブラリで使用すると、クラスライブラリプロジェクトのパスではなく、親ソリューションのパスが返されます。

クラスライブラリプロジェクト自体のパスを取得する方法はありますか?

前もって感謝します。

10
dotnetnoob
    var Mappingpath = System.Web.HttpContext.Current.Server.MapPath("pagename.aspx");

お役に立てれば幸いです。

29
Freelancer

私が理解できるように、あなたは現在のアセンブリの場所が必要です

static public string CurrentAssemblyDirectory()
{
    string codeBase = Assembly.GetExecutingAssembly().CodeBase;
    UriBuilder uri = new UriBuilder(codeBase);
    string path = Uri.UnescapeDataString(uri.Path);
    return Path.GetDirectoryName(path);
}
12
Menelaos Vergis

Server.MapPathは常にWebルートのコンテキストで実行されます。したがって、あなたの場合、Webルートは親Webプロジェクトです。クラスライブラリ(アセンブリ)は個別のプロジェクトのように見えますが、実行時には、それらはすべてWebプロジェクトプロセスでホストされます。したがって、クラスライブラリにあるリソースについては、考慮すべきことがいくつかあります。

まず、クラスライブラリにリソースを保持することが理にかなっているかどうかを検討します。たぶん、Webプロジェクトにxmlファイルがあり、クラスライブラリで参照するだけです。これは、MVCプロジェクトがWebプロジェクトでのビューを維持する方法と同等です。ただし、これはできないと思います。

次に、xmlファイルのビルドプロパティを変更できます。プロパティでファイルをcontentおよびcopy-alwaysに変更した場合。ファイルはbinディレクトリにコピーされます。その後、ファイルにアクセスできるため、Server.MapPathが機能するはずです。

3番目に、リソースを 埋め込みリソース にして、コードで参照できます。これは、構築されたアセンブリに対してすべてのリソースをローカルに保つ方法です。

お役に立てれば。

4
Davin Tryon