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