Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取web项目引用的类库项目中的相对文件路径_C#_Asp.net - Fatal编程技术网

C# 获取web项目引用的类库项目中的相对文件路径

C# 获取web项目引用的类库项目中的相对文件路径,c#,asp.net,C#,Asp.net,我有一个ASP.Net网站,它引用了一个类库。在类库中,我需要将一个文件读入内存 在我的类库的顶层,有一个名为EmailTemplateHtml的文件夹,其中包含我要读取的文件MailTemplate.html 我如何才能做到这一点?我不知道您所说的类库中的文件夹是什么意思,但如果您希望按如下方式构建路径,则可以使用当前工作目录: System.IO.Directory.GetCurrentDirectory() 然后可以使用Path.Combine()方法构建文件路径。如果要查找程序集所在的

我有一个ASP.Net网站,它引用了一个类库。在类库中,我需要将一个文件读入内存

在我的类库的顶层,有一个名为
EmailTemplateHtml
的文件夹,其中包含我要读取的文件
MailTemplate.html


我如何才能做到这一点?

我不知道您所说的类库中的文件夹是什么意思,但如果您希望按如下方式构建路径,则可以使用当前工作目录:

System.IO.Directory.GetCurrentDirectory()

然后可以使用
Path.Combine()
方法构建文件路径。

如果要查找程序集所在的路径;从部件内部,然后使用以下代码:

 public static string ExecutionDirectoryPathName
 {
   get
     {
         var dirPath = Assembly.GetExecutingAssembly().Location;
         dirPath = Path.GetDirectoryName(dirPath);
         return dirPath + @"\";
     }
 }

在VisualStudio中,可以配置库,以便将文件复制到依赖它的任何项目的生成目录中。然后,您可以在运行时获取构建目录的路径,以便读取您的文件

从新溶液开始,逐步说明:

  • 创建应用程序项目和类库项目
  • 通过解决方案资源管理器中应用程序上下文菜单中的属性->添加->引用,从应用程序项目添加对类库项目的引用:

  • 在类库项目中创建需要读取的文件,然后通过解决方案资源管理器中的“属性”窗格将其“复制到输出目录”属性设置为“始终复制”或“复制(如果更新)”:

  • 从类库项目或应用程序(两者都将使用完全相同的代码)中,相对于
    Path.GetDirectoryName(Assembly.getExecutionGassembly().Location)
    引用文件。例如:

    using System.Reflection;
    using System.IO;
    
    namespace MyLibrary
    {
        public class MyClass
        {
            public static string ReadFoo()
            {
                var buildDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                var filePath = buildDir + @"\foo.txt";
                return File.ReadAllText(filePath);
            }
        }
    }
    
    (请注意,在.NET Core之前,您可以使用相对于
    System.IO.Directory.GetCurrentDirectory()
    的文件路径,但这在.NET Core应用程序中不起作用,因为这显然是ASP.NET Core所需要的。)

  • 继续从应用程序代码调用库代码,一切都会正常工作。e、 g:

    using Microsoft.AspNetCore.Mvc;
    using MyLibrary;
    
    namespace AspCoreAppWithLib.Controllers
    {
        public class HelloWorldController : Controller
        {
            [HttpGet("/read-file")]
            public string ReadFileFromLibrary()
            {
                return MyClass.ReadFoo();
            }
        }
    }
    

  • 您可以在类库中添加一个静态类,并设置一些静态方法/属性。在开始应用程序方法时设置Global.ascx.cs中的值。现在您可以获得类库的值

    希望这能说明问题。
    快乐编码

    可能需要在返回的字符串中转义斜杠。在字符串之前添加“@”:return Path.GetFullPath(Path.Combine(dirPath,@“\EmailTemplateHtml\MailTemplate.html”);请注意,在.NET Core之前,它将返回与
    Path.GetDirectoryName(Assembly.getExecutionGassembly().Location)
    (在此处的其他答案中给出)相同的路径,而在.NET Core中,它返回源目录的路径,而不是生成目录(在OP的用例中,有一个不同的应用程序项目和类库项目,这是不正确的,因为当应用程序运行时,其工作目录将不包含来自类库项目的文件)。当我试图添加对磁盘上文本文件的引用时,我得到了错误“确保该文件可访问,并且是有效的程序集或com组件"@user2934433您不能添加对文本文件本身的引用-在步骤2中,我展示了添加对包含文本文件的类库项目的引用。明白了!这里的另一个疑问是您指的是MyLibrary项目,是否有一种方法可以仅通过引用dll来实现?这对我来说太模糊,无法理解您试图描述的方法一些基本的东西——比如你提到的“静态方法/属性”是用来做什么或包含什么的——没有被说明。
    using Microsoft.AspNetCore.Mvc;
    using MyLibrary;
    
    namespace AspCoreAppWithLib.Controllers
    {
        public class HelloWorldController : Controller
        {
            [HttpGet("/read-file")]
            public string ReadFileFromLibrary()
            {
                return MyClass.ReadFoo();
            }
        }
    }