类库项目无法获取自身模板路径,调用时路径指向UI项目
这个问题我之前也碰到过,核心原因其实是类库项目在运行时是被宿主UI项目加载的,所以你用常规的相对路径或者当前目录(比如Directory.GetCurrentDirectory())获取到的都是UI项目的输出目录,而不是类库本身的模板文件位置。下面给你两种实用的解决方案:
解决方案一:将模板文件嵌入为程序集资源(最推荐)
这种方法完全绕开路径问题,把模板文件直接打包进类库的DLL里,不管部署到哪里都能稳定读取:
在Services类库中,找到
EmailTemplates文件夹下的EmailMaster_Body.html文件,右键→属性:- 将「生成操作」改为「嵌入的资源」
- 「复制到输出目录」设为「不复制」即可(因为已经嵌入到DLL中了)
在类库的辅助方法中,通过程序集读取嵌入的资源:
using System.Reflection; using System.IO; // 获取当前类库的程序集实例 var assembly = Assembly.GetExecutingAssembly(); // 资源名称格式:类库根命名空间 + 文件夹路径 + 文件名(路径分隔符用点代替) // 假设你的类库根命名空间是EmailService,那资源名就是"EmailService.EmailTemplates.EmailMaster_Body.html" var resourceFullName = $"{assembly.GetName().Name}.EmailTemplates.EmailMaster_Body.html"; using (var stream = assembly.GetManifestResourceStream(resourceFullName)) using (var reader = new StreamReader(stream)) { string templateContent = reader.ReadToEnd(); // 这里就可以使用读取到的模板内容做后续处理了 }
小提示:如果不确定资源名称,可以用
assembly.GetManifestResourceNames()打印出所有嵌入的资源名,找到对应的那一个。
解决方案二:通过类库程序集位置定位模板文件(适合需要外部修改模板的场景)
如果你的模板需要允许用户在部署后手动修改,那可以保留文件形式,但要确保文件被正确复制到输出目录,再用类库的程序集位置拼接路径:
先设置模板文件的属性:
- 「生成操作」改为「内容」
- 「复制到输出目录」改为「如果较新则复制」(这样每次编译时,最新的模板会被同步到UI项目的bin目录)
在类库的辅助方法中,替换原来的路径构建逻辑:
using System.Reflection; using System.IO; // 获取类库程序集的物理路径 var assemblyPath = Assembly.GetExecutingAssembly().Location; // 提取程序集所在的目录(也就是UI项目bin目录下类库DLL的位置) var assemblyDir = Path.GetDirectoryName(assemblyPath); // 拼接模板文件的完整路径 var templatePath = Path.Combine(assemblyDir, "EmailTemplates", "EmailMaster_Body.html"); // 读取模板内容 string templateContent = File.ReadAllText(templatePath);
为什么原来的方法会失效?
你之前用private static readonly string ThisDir...构建路径,大概率依赖了Directory.GetCurrentDirectory()或者直接用相对路径。但在.NET Core中,Directory.GetCurrentDirectory()返回的是宿主进程的工作目录(也就是UI项目的启动目录),所以拼接出来的路径自然指向UI项目的bin目录,而不是类库原本的模板位置。
内容的提问来源于stack exchange,提问作者dinotom
相关产品推荐
相关产品推荐

