【问题标题】:VS2012 Object Browser shows members that I can't accessVS2012 对象浏览器显示我无法访问的成员
【发布时间】:2013-06-19 15:52:27
【问题描述】:

在 Visual Studio 中使用对象浏览器我正在尝试找到一种方法来在可移植库中捕获主机的默认代理设置。

我知道,这是一个远射。并非所有平台都会有这样的概念,因此可移植库中可能不存在这样的 API,但是我不明白为什么对象浏览器向我显示静态属性 WebRequest.DefaultWebProxy 因为我不能在代码中使用它,它不存在。

您可以看到我已将搜索限制为 .NET 可移植子集。

我误会了什么?

【问题讨论】:

    标签: .net visual-studio-2012 portable-class-library


    【解决方案1】:

    当您在该列表中选择一个程序集时,您可以看到它来自哪里:

    C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETPortable\v4.5

    这是 PCL 参考程序集的“主目录”。但这不是降压停止的地方。 Profile 和 v4.0\Profile 目录中有大量子目录,这些目录的名称类似于“Profilexxx”,其中 xxx 是一个数字。它们包含替代引用程序集,其中包含您在创建项目时选择的特定目标集中的可用类。实际上,它们会删除您选择的目标之一不支持的类。

    对象浏览器的缺陷在于它不知道这些替代品,也不知道您选择了哪个特定配置文件。它只看到主目录中的参考程序集。大概是VS源代码中某处的//TODO。

    【讨论】:

      【解决方案2】:

      实际上可以对 IntelliSense 隐藏类和结构成员。这并不意味着它不存在,IntelliSense 只是不会显示它。我见过一些 BCL 类成员没有出现在 IntelliSense 中。

      如果你知道它存在,你就可以使用它。您不应该在所述属性或方法下看到红色波浪线(除非您使用不正确)。

      查看EditorBrowsableAttribute 文档。还有一个BrowsableAttribute,用于确定在使用可视化设计器时是否在控件的属性网格中显示属性。

      更新:对于有问题的特定静态属性,我上面写的内容无关紧要。我像你一样进行了搜索。问题是WebRequest 对象并不存在于可移植库的 System.dll 中。相反,该对象驻留在System.Net.Requests.dll 程序集中。命名空间还是一样的——System.Net。尝试添加对System.Net.Requests.dll 的引用。

      在使用对象浏览器并执行搜索时,选择您感兴趣的成员。然后,单击搜索栏旁边带有红色“X”的按钮。这将清除搜索结果列表,但您之前选择的成员仍将被选中。然后,您将能够看到该成员在 BCL 中的位置(或者,在您的情况下,是可移植类库)。执行这些步骤时,您可以看到该成员位于 System.Net 命名空间中的 WebRequest 类中,但它位于 System.Net.Requests 程序集中。

      【讨论】:

      • 关于你的第一点,虽然很有趣(我个人知道这个属性)你可以选择在这个工具中显示隐藏的成员。但是,它会为其他一些成员解释这种情况,所以从技术上讲,它是准确的 +1。
      【解决方案3】:

      我不清楚它是否会导致您的问题,但 VS2012 对象浏览器似乎有一个错误,在某些情况下可能会导致它显示实际不存在的属性。如果您的解决方案包含两个项目,每个项目都引用同一个完全限定类的不同定义,则可能会发生这种情况。

      例子:

      我正在为 ASP 网格使用第三方库 (DevExpress)。

      在项目 A 中,我有 DevExpress.Data.v9.1.Linq.dll 定义 DevExpress.Data.Linq.LinqServerModeDataSourceSelectEventArgs 具有 2 个公共属性,QueryableSource 和 KeyExpression。

      在项目 B 中,在同一个解决方案中,我有 DevExpress.Web.v11.2.dll 定义 DevExpress.Data.Linq.LinqServerModeDataSourceSelectEventArgs 具有 3 个公共属性,QueryableSource 和 KeyExpression,和 DefaultSorting

      如果我打开一个包含项目 A 和 B 的解决方案,并打开 ObjectBrowser 来检查 DevExpress.Data.v9.1.Linq.dll,它会显示公共属性 DefaultSorting 是此类的成员(实际上是此属性在 v9.1 dll 中不存在)。如果您尝试在代码中使用此属性,您将收到一个编译器错误,即类“不包含 'DefaultSorting' 的定义”

      如果我打开一个仅包括项目 A 而不包括项目 B 的不同解决方案,并打开 ObjectBrowser 以检查与上述相同的 v9.1 dll,它会正确显示公共属性的缺失默认排序。


      如果这是您上述问题的原因,那么在同一解决方案中打开并使用 .NET 可移植子集以及更广泛的 .NET 框架可能会触发此 ObjectBrowser 错误。 这可能会导致 VS2012 向您显示仅是完整框架一部分的属性,即使您使用对象浏览器检查可移植子集也是如此。

      【讨论】:

        猜你喜欢
        • 2016-05-12
        • 2013-12-02
        • 1970-01-01
        • 1970-01-01
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-06
        相关资源
        最近更新 更多