使用 MSBuild 构建后运行测试时出现 MissingManifestResourceException(.mresource 在清单中有路径)

Posted

技术标签:

【中文标题】使用 MSBuild 构建后运行测试时出现 MissingManifestResourceException(.mresource 在清单中有路径)【英文标题】:MissingManifestResourceException when running tests after building with MSBuild (.mresource has path in manifest) 【发布时间】:2011-08-16 15:26:33 【问题描述】:

我在命令行上使用 MSBuild 的构建服务器上的 C# 项目的嵌入式资源存在问题。该项目在 Visual Studio 中构建和运行测试时运行良好,但从命令行运行 MSBuild 时,运行测试时出现以下问题:


System.Resources.MissingManifestResourceException:找不到适合指定区域性或中性区域性的任何资源。确保“.Properties.Resources.resources”在编译时被正确嵌入或链接到程序集“”中,或者所有需要的附属程序集都是可加载和完全签名的。..

System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet 的 System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(String fileName) RequestCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark & stackMark) at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfoculture, Boolean createIfNotExists, Boolean tryParents) at System.Resources.ResourceManager.GetString(String name, CultureInfoculture) at Properties.Resources.get_SomeResource () 在 \Properties\Resources.Designer.cs:第 87 行


我已将问题追溯到生成的 IL(我使用 ildasm)。在 Visual Studio 中编译时,在程序集的清单中设置以下内容:

.mresource public <PROJECTNAME>.Properties.Resources.resources

  // Offset: 0x00000000 Length: 0x00000236

但是在使用 MSBuild 构建时会生成以下输出:

.mresource public '../..//Build/<PROJECTNAME>_AnyCPU_Debug_Obj/<PROJECTNAME>.Properties.Resources.resources'

  // Offset: 0x00000000 Length: 0x00000236

正如人们所看到的那样,资源的路径突然成为资源名称的一部分。

有人知道如何解决这个问题吗?

【问题讨论】:

【参考方案1】:

似乎将 LogicalName 添加到项目文件可以修复它:

<LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 

即因此项目文件中嵌入的资源条目如下所示:

<ItemGroup>
  <EmbeddedResource Include="Properties\Resources.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    <LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 
  </EmbeddedResource>
</ItemGroup>

详情见:http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

请注意,我们使用的是 .resx 文件,但该错误似乎仍然存在。

【讨论】:

如果能找到一种避免 LogicalName 的解决方案,那就太好了,因为这只会增加摩擦。 将整个 Target "CoreResGen" 从 Microsoft.Common.Targets 复制到项目结束标记之前的项目末尾。然后更改这一行 OutputResources="@(EmbeddedResource->'$(IntermediateOutputPath)%(Filename).resources')" 。

以上是关于使用 MSBuild 构建后运行测试时出现 MissingManifestResourceException(.mresource 在清单中有路径)的主要内容,如果未能解决你的问题,请参考以下文章

运行单元测试时出现语法错误后 PhantomJS 退出

使用 MsBuild 使用命令行进行发布时出现问题单击一次

Visual Studio 2012 解决方案 TeamCity 中的 MSBuild

Xcode 在运行测试时出现“找不到图像”

使用 Xamarin UI 测试运行 UI 测试用例时出现异常“SetUp:System.Exception:无法联系在应用程序中运行的测试后端”

仅在运行测试时出现 DexIndexOverflowException