如何在类库项目中使用Server.MapPath

10

我有一个网络应用程序,它有许多类库项目。以下是一些示例代码。

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属性的路径,但是当我在类库中使用它时,它返回的是父级解决方案的路径,而不是类库项目的路径。

有没有一种方法可以获取类库项目本身的路径?

提前感谢。

3个回答

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

希望这对您有所帮助。


2
需要引用 System.Web 库,而不仅仅是指定它。 - Grant Thomas
1
@自由职业者-抱歉,也许我在我的问题中没有表达清楚。我可以在类库中访问Server.MapPath,但它返回到父项目的路径。我正在寻找获取类库项目路径的方法。 - dotnetnoob

13

我理解您需要当前的装配位置。

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

3
这是我找到的唯一一种既适用于类库又适用于 Web 应用程序的解决方案。谢谢。 - Nicholas J. Markkula

4

Server.MapPath总是在Web根目录的上下文中运行。所以,在您的情况下,Web根目录是父Web项目。虽然您的类库(程序集)看起来像是单独的项目,但在运行时,它们都托管在Web项目进程中。因此,有一些事情需要考虑关于在类库中的资源。

首先,考虑一下是否值得将资源保留在类库中。也许,您应该在Web项目中放置xml文件,并在类库中引用它。这相当于MVC项目如何将其视图保存在Web项目中。但是,我假设您无法这样做。

第二,您可以更改xml文件的构建属性。如果您在其属性中将文件更改为contentcopy-always,则该文件将复制到bin目录中。然后,Server.MapPath应该能够正常工作,因为该文件将可访问。

第三,您可以将资源设置为嵌入式资源,然后在代码中引用它。这是一种将所有资源保留在已构建的程序集本地的方法。

希望这可以帮助您。


这完全没有回答问题。 - Grant Thomas
3
楼主说 Server.MapPath 能够工作,但是返回的是父项目的路径。我只能假设楼主所说的父项目是托管 Web 项目。这三个选项都是用于从引用库中的代码引用 XML 文件内容的方式。所以我理解这是一个完全合理的答案。 - Davin Tryon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接