MSBUILD / csc: 处理x64 mscorlib警告1607的最干净的方法

29
我正在尝试使用VS08SP1的默认项目系统以显式x64模式调用C#编译(与不同)。当我将模块明确标记为x64时,会出现以下警告:

warning CS1607: Assembly generation -- Referenced assembly 'mscorlib.dll' targets a different processor


通过使用/nowarn:1607可以消除这个问题。根据我的研究,实际上这样做没有问题。如果有人能指出他们遇到过的真实问题,请随时回答。

然而,这种方法感觉不太对!所以我使用了另一种方法,即使用/nostdlib+,然后添加一个硬编码的<HintPath>到明确64位的mscorlib中的<Reference>
<Reference Include="mscorlib">
  <HintPath>$(windir)\Microsoft.NET\Framework64\v2.0.50727\mscorlib.dll</HintPath>
</Reference>

这个方法可行且可能更好(除非有人指出之前的方法更好的原因),但是能否有人确认这样做是合适的,最好引用一些权威的内容?

我遇到了同样的问题。对解决方案很感兴趣。谢谢。 - decasteljau
4个回答

9

在这篇博客中,我发现了一个提案,太长了无法完全复制到这里,但是简单来说,这个想法可以通过以下摘要来描述,该摘要经过这条评论的改编:

在项目文件中,您可以为每个构建配置在 PropertyGroup 部分定义自定义变量。例如:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
    <MyCustomPath>C:\Windows\Microsoft.NET\Framework64</MyCustomPath>
</PropertyGroup>

只需添加类似标签

<Reference Include="System.Data">
    <HintPath>$(MyCustomPath)</HintPath> 
</Reference>

然后使用宏定义引用路径。您可以为不同的构建配置(平台和/或调试/发布)将 MyCustomPath 定义为不同位置。
如果MS在VS UI中支持此功能,则问题将不存在,但在此之前,这将起作用。我使用此技术在我的调试和发布版本中引用相同程序集的不同版本。效果很好! 在上述叙述中,我找回了源注释中丢失的标记,并更改了措辞使其更加详细。
来自同一博客的另一个有趣片段:
还有其他方法可以做到这一点,但它们也需要手动编辑项目文件。一种方法是指定PropertyGroup部分的条件。此 StackOverflow 问题强调了条件的使用。

在我的情况下,我实际上不需要这种技术 - 我总是想要 x64。仍然保持问题未被接受 - 我想知道微软推荐处理内置错误的方法(而不必容忍他们可怕的论坛软件:P)。 - Ruben Bartelink

6

我发现将项目的目标框架改为.NET Framework 4后,警告消失了。


3
+1 但是更换不同的CLR和VS就太作弊了:P(认真地,感谢您抽出时间来回答)。 - Ruben Bartelink
最终接受 - 虽然这并没有回答实际问题,但这是我最终使用的解决方案,我想在这个生态系统中这几乎就是惯用的“答案”了... - Ruben Bartelink
2
这根本不是解决问题的方法。它可能适用于你,Todd,但许多项目不能简单地更改为针对不同的框架。 - xxbbcc
4
对我不起作用。我以.NET Framework V4.0为目标,但仍然收到警告。 - C.J.
这种方法的另一个问题是,.NET 4并不总是解决方案。我们正在构建一个可能部署在多个客户环境中的项目,而我们无法控制他们是否拥有4或不拥有4。我们的经验是,4有时也会对其他企业软件造成问题,因此对于那些客户来说可能不是一个选项。 - Jay Imerman
这个类似问题的答案解释了为什么会出现警告,以及.NET 4如何修复这个问题。https://dev59.com/mW855IYBdhLWcg3w6Y5q#4077901 - EnocNRoll - AnandaGopal Pardue

3
我认为第二个选项(使用/nostdlib+明确引用)更好,因为如果您引用了其他不在同一平台上构建的程序集,则不会抑制此警告。

+1 有见地(一开始我不确定)。我会暂时不接受,以保留我的挑剔评级:P (说真的:我很想听听关于我的第二种方法的任何负面意见——如果没有缺点,您可能认为它应该是VS的默认设置)。然而,我猜从“msbuild”的角度来看,这样做非常有意义,而“csc”不应该将所有这些策略直接构建到工具中去。 - Ruben Bartelink
1
除非您在可能没有该路径的汇编语言的x86框上进行编译,否则我想不出任何缺点。 - Peter T. LaComb Jr.
就 MSBuild(实际上是团队构建)而言,我的偏好是在每个平台上运行该平台的构建。 - Peter T. LaComb Jr.

1
在我的情况下,我收到了这个警告,因为我的解决方案中有x86和x64项目混合。如果我在所有项目中创建x86构建配置,并将其作为构建目标,那么警告就会消失。但是,如果我想在所有项目中使用x64,我相信我将不得不重新构建项目(或按照上面的建议)以适应x64框架。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接