18

我正在使用 Microsoft TFS API,其中一个接口上的属性之一已被标记为已过时,它指示我使用不同的属性。不幸的是,API 希望我使用的属性由 TFS2010 而不是 TFS2008 使用。

我试过这样做:

#pragma warning disable 0612, 0618
            request.CommandLineArguments = arguments;
#pragma warning restore 0612, 0618

但是我仍然收到 CommandLineArguments 已过时的错误。有没有办法压制这个?

编辑

不幸的是,这并没有显示为“警告为错误”,实际上将警告视为错误在我的项目中已关闭。这是违规代码的屏幕截图以及错误列表

在此处输入图像描述

编辑2:

使用 ILSpy 后,TFS2010 API 中的 CommandLineArguments 属性如下所示:

    [Obsolete("This property has been deprecated. Please remove all references. To pass command line arguments to MSBuild.exe, set the ProcessParameters property.", true)]
    string CommandLineArguments
    {
        get;
        set;
    }

不幸的是,我认为没有办法告诉编译器忽略 Obsolete 属性导致的错误。

编辑 3 正如@Peter Ritchie 指出的,这个值可以通过反射来设置。正如我对这个问题的思考,尽管我的猜测是,如果 Microsoft 将属性设置为抛出异常,即使您确实通过反射设置了它,我怀疑该值是否会在任何地方被引用。

4

3 回答 3

19

以下对我有用:

#pragma warning disable 612,618
            request.CommandLineArguments = arguments;
#pragma warning restore 612,618

注意数字中没有前导0

编辑:好的,您的程序集在 ObsoleteAttribute 构造函数中具有“true”参数。这意味着您不能使用该属性并且不会出现错误。

如果您无法重新编写代码以避免使用此属性,则必须通过反射调用属性设置器,例如:

request.GetType().GetProperty("Number").SetValue(request, arguments, null);

和得到是相似的:

(string)request.GetType().GetProperty("CommandLineArguments").GetValue(request, null);

于 2012-05-15T20:40:57.210 回答
19

视觉工作室 2015

由于 [过时] 导致构建失败?

仅当启用“将警告视为错误”并且存在具有 [Obsolete] 属性的方法时才会发生这种情况。

方法一:将错误降级为警告

添加文件(<WarningsNotAsErrors>612,618</WarningsNotAsErrors>.csproj所有部分重复):

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
    <WarningLevel>4</WarningLevel>
    <WarningsNotAsErrors>612,618</WarningsNotAsErrors>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
</PropertyGroup>

如果处理很多.csproj files,请参阅Appendix A: Notepad++ for search and replace

方法2:忽略文件中的错误

注意:不推荐使用此方法,因为它隐藏了标记为 [Obsolete] 的方法的警告。我们仍然希望看到对过时方法的所有调用的列表,以便我们可以升级它们。

采用#pragma warning disable 612,618

方法3:忽略项目中的错误

注意:不推荐使用此方法,因为它隐藏了标记为 [Obsolete] 的方法的警告。我们仍然希望看到对过时方法的所有调用的列表,以便我们可以升级它们。

编辑项目(对所有部分重复):

在此处输入图像描述

方法4:忽略项目中的错误

注意:不推荐使用此方法,因为它隐藏了标记为 [Obsolete] 的方法的警告。我们仍然希望看到对过时方法的所有调用的列表,以便我们可以升级它们。

手动编辑您的 .csproj 以禁用特定错误的警告。添加标签<NoWarn>612,618</NoWarn>(对所有部分重复):

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
    <NoWarn>612,618</NoWarn>
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\x64\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
    <DebugType>full</DebugType>
    <PlatformTarget>x64</PlatformTarget>
    <ErrorReport>prompt</ErrorReport>        
</PropertyGroup>

附录 A:用于搜索和替换的 Notepad++

有很多文件吗?没问题!

.csproj在 NotePad++ 中打开所有文件,然后:

  • 寻找:<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
  • 代替:<TreatWarningsAsErrors>true</TreatWarningsAsErrors>\n\t<WarningsNotAsErrors>612,618</WarningsNotAsErrors>

在此处输入图像描述

于 2016-11-10T10:25:12.677 回答
10

以防万一其他人偶然发现这一点。

如果您将设置属性的方法标记为已过时并且不要将其标记为 true,编译器将忽略内部错误并抛出您的更高级别的警告,您可以忽略该错误。

IE

[Obsolete("Cause it aint",false)]
public void Foo(object arguments)
{
     request.CommandLineArguments = arguments;
} 
于 2017-01-18T23:12:12.040 回答