1

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

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

我的对象浏览器

您可以看到我已将搜索限制在 .NET Portable Subset。

我有什么误解?

4

3 回答 3

2

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

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

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

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

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

于 2013-06-19T18:02:12.827 回答
2

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

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

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

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

于 2013-06-19T20:00:05.037 回答
0

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

例子:

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

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

在项目 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,它会正确显示公共属性 DefaultSorting 的缺失。


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

于 2014-12-15T23:29:53.863 回答