2009-08-13 68 views
27

我试图使用VS08SP1的默认项目系统以显式x64模式(与AnyCpu不同)调用C#编译。当我明确地标记模块64,我得到一个:MSBUILD/csc:处理x64的最干净的方式mscorlib警告1607

警告CS1607:程序集生成 - 引用程序集“mscorlib.dll中”目标

一种方法去除是一个不同的处理器一个/nowarn:1607Based on my research,这样做在实践中没有问题。如果任何人都能看到他们遇到的现实世界的问题,请随时回答。

但是,这只是感觉错误!所以我用另一种方法是做/nostdlib+,然后添加一个<Reference>用硬编码<HintPath>到明确的64位mscorlib程序:

<Reference Include="mscorlib"> 
    <HintPath>$(windir)\Microsoft.NET\Framework64\v2.0.50727\mscorlib.dll</HintPath> 
</Reference> 

这个工程和可能是更好的(除非有人关心地指出原因前面方法更好),但是有人可以证实这是一个合适的事情,希望引用某些专利。

+0

我遇到了同样的问题。会对解决方案感兴趣。谢谢。 – decasteljau 2009-10-06 14:13:52

回答

5

我发现通过将项目的目标框架更改为.NET Framework 4,它消除了警告。

+1

+1但是转移到不同的CLR和VS是作弊:P(Serioulsy,感谢您花时间回答) – 2011-05-03 23:42:18

+0

最后接受 - 虽然这不能回答真正的问题,但这是我实际上最终使用的解决方案,而我猜测它几乎是这个生态系统中惯用的“答案”...... – 2012-02-04 08:39:49

+2

这不是以任何方式解决问题的方法。它可能对你有用Todd,但许多项目不能简单地改变为针对不同的框架。 – xxbbcc 2012-10-31 15:27:01

3

我相信你的第二个选择(明确参考/nostdlib+)更好,因为如果你要引用不是在同一平台上构建的其他程序集,它不会抑制此警告。

+0

+1洞察力(首先阅读我不确定)。我会延迟接受挑剔的评级:P(严重:我有兴趣听到我的第二种方法的任何消极处理 - 如果没有缺点,你会认为它会被VS默认)。不过,我从'msbuild'的角度来看,它有很大的意义,'csc'不应该将所有这个策略直接构建到工具中。 – 2010-11-04 23:59:05

+1

我想不出任何缺点,除非您在x86盒子上进行编译那可能没有那个路径上的程序集。 – 2010-11-05 14:02:45

+0

就msbuild而言(真正的团队构建),我的偏好是运行在该平台上构建的每个平台。 – 2010-11-05 14:03:51

9

In this blog我发现太长,在这里完全复制,但在很短的想法可以总结改编自this comment描述的建议:

在项目文件中,你可以自定义一个变量在每个构建配置的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中支持这个问题,问题就不会存在,但在此之前这将工作。我使用这种技术在我的调试&版本构建中引用相同程序集的不同版本。很棒!

在上面的诵读中,我找回了源评论栏中丢失的标签,并将字词更改得更详细。


另外一个有趣的一件从same blog

还有一些其他的方法可以做到这一点,但他们也需要一个手动编辑项目文件。一种方法是为PropertyGroup部分指定条件。这个StackOverflow问题突出了条件的使用。

+0

+1在我的情况下,我实际上并不需要这种技术 - 我总是希望'x64'。仍然让问题不被接受 - 我想知道微软会推荐什么样的方式来处理内置错误(而不必容忍他们可怕的论坛软件:P) – 2012-02-04 08:37:52

0

在我的情况,我有这个警告,因为我的解决方案中有x86和x64项目的混合。如果我在我的所有项目中创建x86构建配置,并将其作为构建目标,则警告消失。但是,如果我想要全部定位到x64,我相信我将不得不重新构建项目(或者按照上面的建议)来为x64框架重新设计它们。