如何在可移植类库中使用TypeForwardedTo
本文关键字:TypeForwardedTo 类库 可移植 | 更新日期: 2023-09-27 18:28:19
我正在尝试构建一个可移植类库,该类库在可用时使用平台上的实现。例如,Lazy<T>
在.NET 4.5、Windows应用商店应用程序、Windows Phone 8上可用,但在Windows Phone 7、Silverlight 4上不可用。当我的PCL加载到一个具有Lazy<T>
实现的平台上时,我希望使用该平台的实现。当它在平台上不可用时,我想使用我自己的实现。这似乎是可能的,因为微软BCL正在做这件事,但我还没有弄清楚如何实现它
我已经读到,通过使用TypeForwardedToAttribute
,您可以重定向PCL以使用平台上的实现。我不太确定如何配置我的Visual Studio项目来实现这个结果。如果CoreLib是我的库,并且ShimLib包含我的Lazy<T>
实现。在哪里添加TypeForwardedToAttribute?该属性需要一个实际的类型引用typeof(System.Lazy<>)
,当PCL中的目标是Windows Phone 7时,该引用不起作用。如果我删除了Windows Phone 7,那么我就无法将CoreLib的引用添加到ShimLib,因为ShimLib并不支持CoreLib所支持的所有平台。我该如何处理?
是的,我知道Lazy<T>
非常容易实现,但它只是一个例子,我的实际情况适用于更多实现起来不那么琐碎的类。
Microsoft.Bcl通过运送具有相同标识的两个程序集来实现这一点;一个是类型本身,一个是向前类型。当针对不支持Lazy的平台(包括包含其中一个平台的可移植库组合)时,可以引用具有类型的。并且在使用Lazy定位平台时引用具有类型forward的库,这使得能够使用针对旧平台构建的库。
请注意,Microsoft。Bcl有一个你没有的小优势。我们提供的程序集与更高版本中的程序集具有相同的标识,这意味着当Windows Phone 7应用在Windows Phone 8上运行时,它们将获得内置的版本,而不是填充程序库中的版本。你无法模仿这一点,但在你的情况下,这可能是你可以接受的。
类型转发的原理思想在这个问题和本文中得到了很好的解释,我不再重复这里的细节。但是,总的来说,我们的想法是能够重用库A
,而无需重新编译,即使它引用的库B
正被库C
替换。为此,必须修改库B
,使其将引用转发到库C
,这正是TypeForwardedTo属性所做的。
这对你有什么帮助?好吧,您可以创建ShimLib
,使其被所有项目引用,但使用条件编译和类型转发将其链接到框架库(如果存在)。幸运的是,有人已经为你做了:)
编辑以回应Matt的评论:你说得对,我忽略了Theraot没有回到最初的实现。我想如果不重新编译,这将很难实现。你能做的最好的事情可能就是遵循这个策略,即为不同的框架版本提供不同的构建配置。这样,就可以有条件地编译TypeForwardedToAttribute
。至少,这样可以避免重复代码。如果您真的不想分发不同版本的代码,您可以实现一个引导程序来确定框架版本,并加载使用此版本的构建配置编译的程序集版本