使用MSBuild构建后运行测试时缺少MissingManifestResourceException(.mresource在清单中具有路径) [英] MissingManifestResourceException when running tests after building with MSBuild (.mresource has path in manifest)

查看:157
本文介绍了使用MSBuild构建后运行测试时缺少MissingManifestResourceException(.mresource在清单中具有路径)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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


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

System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet中的System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(String fileName)(CultureInfo文化,Dictionary`2 localResourceSets,Boolean tryParents,布尔createIfNotExsourceSetRemark. CultureInfo在System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo文化,Boolean createIfNotExists,布尔tryParents)在属性. \ Properties \ Resources.Designer.cs:第87行中的.get_SomeResource():


我已将问题跟踪到生成的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
}

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

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

解决方案

在项目文件中添加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>

有关详细信息,请参见:

System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(String fileName) at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark) at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark) at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) at System.Resources.ResourceManager.GetString(String name, CultureInfo culture) at Properties.Resources.get_SomeResource() in \Properties\Resources.Designer.cs:line 87


I have tracked the problem down into the generated IL (I use ildasm). When bulding in Visual Studio, the following is set in the manifest of the assembly:

.mresource public <PROJECTNAME>.Properties.Resources.resources
{
  // Offset: 0x00000000 Length: 0x00000236
}

but when building using MSBuild the following output is generated:

.mresource public '../..//Build/<PROJECTNAME>_AnyCPU_Debug_Obj/<PROJECTNAME>.Properties.Resources.resources'
{
  // Offset: 0x00000000 Length: 0x00000236
}

as one can see the path to the resource is suddenly part of the resource name.

Does anyone have any ideas how to fix this?

解决方案

It appears adding LogicalName to the project file fixes it:

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

i.e. so the embedded resource entry in the project file looks like this:

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

This is detailed in: http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

Note that we are using a .resx file, but the bug still appears to occur.

这篇关于使用MSBuild构建后运行测试时缺少MissingManifestResourceException(.mresource在清单中具有路径)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆