0

我正在将我的库转换为 PCL。但我不明白可用类型如何取决于所选平台。

使用这些设置:
在此处输入图像描述

与此类配置一样,我的可用类型更少:
在此处输入图像描述

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


更新

据我了解,存在一些命名混乱。
最初与这些平台相关的术语可移植类库:.NET Framework、Silverlight、Windows Phone 和 Xbox 360。至少文档是这样说的。
在下一个版本中,他们添加了 Windows 应用商店应用程序。这里有一些奇怪的事情。

它如何寻找ICommand
在此处输入图像描述

..对于Type.IsInstanceOfType()
在此处输入图像描述

等待!Windows 应用商店在哪里?为什么是单独的行?如果 PCL 包含 Windows 应用商店,WSA 怎么不能支持此功能?

一个奇怪的问题:如果我启用了 .NET 4.5,SL5、WP8 和 WSAType.IsInstanceOfType()就存在并且可以访问。但是如果我禁用 SL5,这个方法就会消失,因为它从来没有存在过。这到底是怎么回事?


这个 SO anwser可能会有所帮助。

4

2 回答 2

3

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

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

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

编辑

Type.IsInstanceOfType()至于您对在目标中包含Silverlight 5时存在的方法的具体担忧,而如果您省略 SL5 则会丢失,我没有任何明确的答案。我只能观察到,SL5 的组合被标识为 PCL 配置文件 158,它与 Visual Studio 2010 兼容,而没有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()会是什么样子,但我认为想出一个应该不会太难。

于 2013-08-26T14:41:39.093 回答
2

首先,仅仅因为某些东西在便携式中可用,并不能使它在所有支持便携式的平台上都可用。例如,MEF (System.ComponentModel.Composition.dll) 在面向 Silverlight 和 .NET Framework 时可用,但将 Windows Store 或 Phone 添加到您的目标平台,它就会消失,因为这些平台不支持它。

然而,话说回来,您在上面看到的是在此页面上调用的遗留表面和新表面之间的泄漏抽象:什么是 .NET 可移植子集(遗留)?.

在新的表面积中,System.Reflection 表面积(包括 System.Type)已经从旧的表面积发生了变化。某些功能已被更改、移动或完全删除。Type 上的大多数成员已替换为 TypeInfo 上的功能。您可以通过添加 using 语句“using System.Reflection”,然后调用 GetTypeInfo 来从 Type -> TypeInfo 开始。

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

于 2013-08-27T18:48:11.117 回答