如何根据支持的平台了解哪些类型可用?

时间:2013-08-26 13:07:22

标签: .net portable-class-library

我正在将我的图书馆转换为PCL。但我不明白可用类型如何依赖于所选平台。

使用以下设置:
enter image description here

与这种配置相比,我的可用类型更少:
enter image description here

怎么可能?
是否有任何服务可以根据所选选项添加|删除类型和操作?


更新

据我所知,有一些命名混淆 最初是与这些平台相关的可移植类库这个术语:.NET Framework,Silverlight,Windows Phone和Xbox 360.至少documentation这样说。
但在next version中,他们添加了Windows应用商店应用。这里有一些奇怪的事情。

它如何查找ICommand
enter image description here

.. Type.IsInstanceOfType()
enter image description here

等待!哪个是Windows商店?为什么它是一个单独的线?如果PCL包含Windows Store,WSA如何不支持此功能?

一个奇怪的怪:如果我有.NET 4.5,则启用SL5,WP8和WSA Type.IsInstanceOfType()并且可以访问。但是,如果我禁用SL5,这种方法就会消失,因为它从未出现过。这究竟是怎么回事?


此SO anwser可能会有所帮助。

2 个答案:

答案 0 :(得分:3)

几个月前,Vagif Abilov在Github上发布了他的项目pclanalyzer。此工具允许您扫描现有的.NET类库或可执行文件,并确定特定的可移植类库配置中可用的方法。

该工具使用this Excel文件中的信息,列出所有与PCL兼容的类,方法,属性等,以及每个可用的框架。

您可以在blog上阅读有关Vagif工具的更多信息。如果您不想自己构建该工具,Vagif还提供了二进制文件here

修改

关于在目标中包含 Silverlight 5 时出现的Type.IsInstanceOfType()方法的具体问题,如果省略SL5则丢失,我没有任何明确的答案。我只能观察到 SL5的组合被识别为与Visual Studio 2010兼容的PCL配置文件158,而没有 SL5的组合被表示为PCL配置文件78并且与VS 2010不兼容。出于某种原因,Type.IsInstanceOfType()必须被排除在配置文件78之外。另一方面,此配置文件似乎支持许多其他功能;您可能需要查看这些文件夹的相应内容,以便更好地了解相应配置文件支持的程序集:

  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETPortable \ v4.5 \ Profile \ Profile78
  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETPortable \ v4.0 \ Profile \ Profile158

我不能说出Type.IsInstanceOfType()的替代实现会是什么样的,但我认为它不应该太难以提出。

答案 1 :(得分:2)

首先,只是因为便携式产品可用,并不能在支持便携式设备的所有平台上使用。例如,MEF(System.ComponentModel.Composition.dll)在定位Silverlight和.NET Framework时可用,但是将Windows Store或Phone添加到目标平台,它会消失,因为这些平台不支持它。

然而,在上述内容中,您可以看到遗留表面与新表面之间的漏洞抽象,如本页所述:What is .NET Portable Subset (Legacy)?

在新的表面区域中,System.Reflection表面区域(包括System.Type)已从旧表面区域更改。某些功能已更改,移动或完全删除。 Type上的大多数成员已被TypeInfo上的功能替换。你可以从一个类型 - > TypeInfo通过添加using语句“using System.Reflection”,然后调用GetTypeInfo。

如果Windows应用商店没有旧的API,那么为什么在包含Windows应用商店的某些情况下它会显示在便携式设备中? Windows Store“隐式”支持这些API。在仅针对Windows Store时,它不会在构建时公开它们,但我们保证这些API在运行时可用。