如何在Portable Class Libraries中使用TypeForwardedTo?

时间:2013-08-19 05:12:29

标签: c# .net portable-class-library

我正在尝试构建一个可移植类库,它在可用时使用平台中的实现。例如,Lazy<T>可用于.NET 4.5,Windows应用商店应用程序,Windows Phone 8,但它在Windows Phone 7,Silverlight 4上不可用。当我的PCL加载到其中一个具有{{{ 1}}实现,我想使用平台的实现。当它在平台上不可用时,我想使用我自己的实现。这似乎是可能的,因为Microsoft BCL正在这样做,但我还没弄清楚如何实现它。

我已经通过使用Lazy<T>读到了这一点,您可以重定向PCL以使用平台中的实现。我不太确定如何配置我的Visual Studio项目来实现此结果。如果 CoreLib 是我的库, ShimLib 包含我的TypeForwardedToAttribute实现。我在哪里添加TypeForwardedToAttribute?该属性需要实际的类型引用Lazy<T>,这在Windows Phone 7作为PCL中的目标时不起作用。如果我删除Windows Phone 7,那么我无法将CoreLib的引用添加到ShimLib,因为ShimLib不支持CoreLib所做的所有平台。我该如何处理?

是的,我知道typeof(System.Lazy<>)非常容易实现,但它只是一个例子,我的实际情况适用于更多不太容易实现的类。

2 个答案:

答案 0 :(得分:8)

Microsoft.Bcl通过发送具有相同标识的两个程序集来实现此目的;一个类型本身,一个类型转发。在针对不支持Lazy的平台(包括包含其中一个平台的可移植库组合)时,您可以引用具有该类型的那个。当使用Lazy定位平台时,引用具有类型转发的那个,这使得能够使用针对旧平台构建的库。

请注意,Microsoft.Bcl具有您没有的一点优势。我们发送的程序集与已在更高版本中的程序集具有相同的标识,这意味着当Windows Phone 7 应用程序在Windows Phone 8上运行时,它们会获得内置的版本,而不是一个在垫片库中。你无法模仿,但这可能是你在你的情况下可以忍受的事情。

答案 1 :(得分:5)

this问题和this文章中很好地解释了类型转发的主要思想,我在此不再重复细节。但总的来说,我们的想法是能够重用库A 而无需重新编译,即使它引用了库<{1}} 正在被替换 strong>由图书馆B。为此,必须修改库C,使其转发对库B的引用,这正是TypeForwardedTo属性的作用。

这对您有何帮助?好吧,你可以创建你的C,使它被你的所有项目引用,但是使用条件编译和类型转发将它链接到框架库(如果存在的话)。幸运的是,someone already did that for you:)

编辑以回应Matt的评论:你是对的,我忽略了Theraot没有回到最初的实现。我想如果不重新编译就很难实现。您可以做的最好的事情可能是遵循this策略,即为不同的框架版本提供不同的构建配置。这样,您可以有条件地编译ShimLib。至少,这可以使您免于重复代码。如果你真的不想分发不同版本的代码,你可以实现determines the framework version的引导程序并加载已使用构建配置编译的程序集版本版本