3

我们目前正在评估 VS2010,并将我们的 VS2008 C++/CLI 项目升级到新的 .vcxproj 格式。我注意到我们在项目设置中设置的某个属性没有正确翻译。在 Configuration Properties -> Managed Resources -> Resource Logical Name 下,我们曾经(在 VS2008 中)具有以下设置:

$(IntDir)\$(RootNamespace).$(InputName).resources

这表明所有 .resx 文件都将编译成

OurLib.SomeForm.resources

组件内部。(调试部分在组装时被丢弃)

根据 MSDN,$(InputName) 宏不再存在,应替换为 %(Filename)。但是,当翻译上述行以交换这些宏时,它似乎永远不会扩展。它尝试编译的第二个 .resx 文件,我得到一个“链接:致命错误 LNK1316:重复的托管资源名称 'Debug\OurLib.%(Filename).resources”。这向我表明 % 样式宏在这里没有被扩展,至少在这个特定的属性中。

如果我们没有在该属性中设置任何内容,则默认行为似乎是将子目录添加为前缀,例如:

OurLib.Forms.SomeForm.resources

其中 Forms 是 .resx 文件所在项目的子目录。仅当 .resx 文件位于正在构建的项目的直接子目录中时,才会发生这种情况。如果 .resx 文件存在于磁盘上的其他位置(又名 ..\OtherLib\Forms\SomeForm2.resx),则不会添加此前缀。

这会导致加载表单资源出现问题,因为它没有考虑到这个可能的前缀,即使我们使用的是标准的表单设计器获取资源的方法:

System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(SomeForm::typeid));

并且不要按名称指定 .resources 文件。

我刚刚描述的问题可能与原始问题不同,但如果我要修复资源逻辑名称问题,我认为这一切都会消失。有没有人有关于这些 % 宏以及允许在哪里使用它们的任何信息?

4

0 回答 0