ASP.NET Core C#项目中无法访问嵌入式资源该如何处理?
问题原因排查及解决方案
你当前GetManifestResourceStream的引用方式存在两处可能的问题,对应解决方法如下:
大小写匹配问题
你在.csproj中设置的LogicalName值为Assets/Loyalty-template.html,文件名首字母L为大写,但代码中传入的参数是Assets/loyalty-template.html首字母l为小写,嵌入式资源名称大小写敏感,不匹配会直接返回null。
如果要沿用当前LogicalName配置,直接将代码参数修改为完全匹配的Assets/Loyalty-template.html即可。默认资源命名规则问题
如果你删除了自定义的LogicalName配置,就需要遵守.NET嵌入式资源的默认命名规则:
默认资源名格式为{程序集默认命名空间}.{文件相对路径替换斜杠为点}
比如你项目的默认命名空间为DemoProject,则对应资源名是DemoProject.Assets.loyalty-template.html,将该值作为参数传入即可。
通用验证方法
如果以上方法都不生效,可以先执行以下代码打印当前程序集内所有嵌入式资源的完整名称,直接复制对应资源名作为参数即可100%匹配:
// 输出当前程序集所有嵌入式资源名称 var allResourceNames = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); foreach (var resName in allResourceNames) { System.Diagnostics.Debug.WriteLine(resName); }
额外注意项
如果你的嵌入式资源定义在类库项目中,调用代码在其他项目,不要使用GetExecutingAssembly(会拿到调用方程序集,而非资源所在程序集),需要通过资源所在程序集的任意类型获取对应程序集,示例:
// 假设资源所在程序集有一个名为AssetLoader的类 var assembly = typeof(AssetLoader).Assembly; using var stream = assembly.GetManifestResourceStream("对应资源名");
内容的提问来源于stack exchange,提问作者SeventhWarhawk
相关产品推荐
相关产品推荐

