Tag: forward declaration

在.NET应用程序中使用PCL时,如果被调用的类包含方法,则为TypeLoadException

我正在将现有的.NET类库改编为可移植类库。 我使用配置文件78(.NET 4.5,Windows Store 8,Windows Phone 8)支持配置文件158(也针对Silverlight 5),因为我希望能够编译原始库的unsafe代码。 .NET库包含很多标记为[Serializable]的类,所以我实现了一个包含虚拟SerializableAttribute实现的支持PCL库: public class SerializableAttribute : Attribute { } 它是从主PCL库中引用的。 为了充分利用.NET应用程序中的主PCL库,同时避免类型名称冲突,我还准备了一个.NET支持库(与PCL支持库具有相同的强名称),包含类型转发声明: [assembly: TypeForwardedTo(SerializableAttribute)] 并在我的.NET应用程序中显式引用.NET支持库而不是PCL库。 在准备好所有这些并且能够成功编译PCL适配库之后,我重新使用原始.NET库中的unit testing,现在引用PCL主库和.NET支持库。 这通常非常有效,但对于包含[Serializable]类和[OnDeserialized]修饰方法的unit testing: [Serializable] public class Foo { [OnDeserialized] private void DoSomething(StreamingContext context) { } } 我得到以下TypeLoadException : 在程序集“MyPclAssembly”中键入“Foo”的方法为“DoSomething”,其序列化属性的签名不正确。 (可以注意到OnDeserializedAttribute包含在可移植子集中,可能是因为它也在[DataContract]序列化中被识别。) 在原始.NET库上运行unit testing时,我没有获得exception。 我仔细分析了Foo类中的方法签名,它完全符合这些(de-)序列化辅助方法应该具有的签名,参见例如此处 。 我也尝试将[OnDeserialized]方法的可见性更改为internal和public ,但无济于事。 使用PCL库时出现此exception的原因是什么,我该怎么做才能避免它? 编辑我已经检查了PCL库的IL代码和[OnDeserialized]方法的.NET库,我看不出任何相关的区别: PCL .method private hidebysig instance […]