【问题标题】:How to understand which types will be available depending on supported platforms?如何根据支持的平台了解哪些类型可用?
【发布时间】:2013-08-26 13:07:22
【问题描述】:

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

使用这些设置:

与此类配置相比,我的可用类型更少:

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


更新

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

如何查找ICommand:

..for Type.IsInstanceOfType():

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

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


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

【问题讨论】:

    标签: .net portable-class-library


    【解决方案1】:

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

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

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

    编辑

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

    【讨论】:

    • 似乎这个 excel 文件有错误的信息,或者我完全误解了会发生什么。启用 WSA、4.5 和 WP8 后,我无法访问 methodType.IsIntanceOfType() 而 excel 显示我必须访问。
    • @voroninp 我不能肯定地回答你的问题,但请看看上面回复中的额外推理。
    • @voroninp:当您面向 Windows 应用商店、.NET 4.5 和 Windows Phone 8 或更高版本时,反射 API 会发生变化。有关更多信息,请参阅此答案:stackoverflow.com/a/14063316/1509
    【解决方案2】:

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

    然而,话说回来,您在上面看到的是旧表面和新表面之间的泄漏抽象,如本页所称:What is .NET Portable Subset (Legacy)?

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

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

    【讨论】:

    • 感谢您的澄清。真的不是很直观的变化。如果您不介意,还有一个问题:stackoverflow.com/questions/18474112/…
    • 它根本不是很直观,便携式试图弥合两个不同 API 表面区域之间的差距,它变得非常抽象。
    猜你喜欢
    • 2018-12-25
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 2011-06-28
    相关资源
    最近更新 更多