You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一项目中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文件中,也会导致两台机器的资源命名规则不同。

统一解决方案

  1. 统一项目文件中的资源配置
    打开项目的.csproj文件,添加统一的嵌入式资源配置,确保所有机器使用相同的命名规则:

    • 若要保留相对路径格式(支持assets/path/to/file.sql访问):
      <ItemGroup>
        <EmbeddedResource Include="assets\**\*" />
      </ItemGroup>
      
    • 若要统一使用纯文件名访问:
      <ItemGroup>
        <EmbeddedResource Update="assets\**\*">
          <LogicalName>%(Filename)%(Extension)</LogicalName>
        </EmbeddedResource>
      </ItemGroup>
      
  2. 同步配置到版本库
    将修改后的.csproj提交到git,确保所有检出项目的机器使用相同的配置,避免本地差异。

  3. 验证资源命名
    可以在代码中临时添加日志,输出所有资源名称,确认配置生效:

    foreach (var name in Assembly.GetCallingAssembly().GetManifestResourceNames())
    {
        Console.WriteLine(name);
    }
    

内容的提问来源于stack exchange,提问作者Erik Simon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:50:45