同一项目中EmbeddedFileProvider加载资源路径不一致问题求助
问题根源与解决方案
这种差异的核心原因是两台机器上项目文件(.csproj)中嵌入式资源的配置不一致——即使代码、SDK版本和系统完全相同,嵌入式资源的命名规则也会因项目配置差异而变化,具体分析如下:
可能的差异点
资源逻辑名称配置不同
.NET中嵌入式资源的最终名称由项目文件里的<EmbeddedResource>项决定:- 若某台机器的项目文件中给资源设置了
<LogicalName>为纯文件名(如file.sql),则Assembly.GetManifestResourceNames()只会返回文件名,此时只能用文件名访问; - 另一台机器未设置该属性,默认会将资源的相对路径转换为点分隔的格式(如
assets.path.to.file.sql),对应EmbeddedFileProvider需要用assets/path/to/file.sql的路径访问。
示例配置(强制使用纯文件名):
<EmbeddedResource Update="assets\path\to\file.sql"> <LogicalName>file.sql</LogicalName> </EmbeddedResource>- 若某台机器的项目文件中给资源设置了
Git忽略了项目文件的局部修改
若其中一台机器修改了.csproj的资源配置但未提交到版本库,另一台拉取的是原始配置,就会出现这种不一致。检查.gitignore是否意外忽略了.csproj文件,或者确认是否有未提交的csproj修改。文件属性的本地配置差异
在Visual Studio中右键资源文件→属性,若其中一台机器设置了“逻辑名称”为纯文件名,且该配置保存在被git忽略的.user文件中,也会导致两台机器的资源命名规则不同。
统一解决方案
统一项目文件中的资源配置
打开项目的.csproj文件,添加统一的嵌入式资源配置,确保所有机器使用相同的命名规则:- 若要保留相对路径格式(支持
assets/path/to/file.sql访问):<ItemGroup> <EmbeddedResource Include="assets\**\*" /> </ItemGroup> - 若要统一使用纯文件名访问:
<ItemGroup> <EmbeddedResource Update="assets\**\*"> <LogicalName>%(Filename)%(Extension)</LogicalName> </EmbeddedResource> </ItemGroup>
- 若要保留相对路径格式(支持
同步配置到版本库
将修改后的.csproj提交到git,确保所有检出项目的机器使用相同的配置,避免本地差异。验证资源命名
可以在代码中临时添加日志,输出所有资源名称,确认配置生效:foreach (var name in Assembly.GetCallingAssembly().GetManifestResourceNames()) { Console.WriteLine(name); }
内容的提问来源于stack exchange,提问作者Erik Simon
相关产品推荐
相关产品推荐

