PCL 个文件中的自定义异常
Custom Exceptions in PCL files
我目前正在将我们的 .net 业务对象库转换为 PCL 文件,以便它可以与 Xamarin IOS/Android 一起使用,虽然它主要包含 POCO 对象,但它也包含自定义异常但这是抛出错误。
采用典型的自定义异常:
[Serializable]
public class EncryptKeyNotFoundException : Exception
{
public EncryptKeyNotFoundException()
: base() { }
public EncryptKeyNotFoundException(string message)
: base(message) { }
public EncryptKeyNotFoundException(string format, params object[] args)
: base(string.Format(format, args)) { }
public EncryptKeyNotFoundException(string message, Exception innerException)
: base(message, innerException) { }
public EncryptKeyNotFoundException(string format, Exception innerException, params object[] args)
: base(string.Format(format, args), innerException) { }
protected EncryptKeyNotFoundException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
}
不出所料,PCL 不喜欢 [Serializable]
和 SerializationInfo
。虽然我可能会坚持使用 [DataContract] 而不是使用 [Serialiable]
,但它仍然无法解决 SerializationInfo
的问题。
有没有什么办法可以绕过这个问题?
谢谢。
更新:
我已经按照建议查看了 Implementing custom exceptions in a Portable Class Library,但无法识别以下 2 个属性:
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
我一定是遗漏了对哪个程序集的引用?
我目前正在寻找 Portable class library: recommended replacement for [Serializable]
中提供的替代解决方案
希望这会奏效。一旦我有更多信息要提供,我会更新我的答案。
更新:
ClassInterfaceAttribute
是 System.RunTime.InteroServices 的一部分,但我无法将其添加到我的 PCL 项目中,至少它是不可见的。我错过了什么吗?
另一篇文章提供了额外的信息,看起来在使用条件编译时,这应该可以工作,但是同样,虽然 json 库中的示例代码似乎可以工作,但我一定遗漏了一些东西,因为我无法添加引用以使 [Serializable]
不会引发错误,但我似乎无法这样做。
我试过的一件事就是简单地注释掉:
protected EncryptKeyNotFoundException(SerializationInfo info,
StreamingContext context) : base(info, context) { }
而且我可以编译我的 pcl 项目,所以问题是我需要这个吗?
谢谢。
我认为您误解了建议 link 中的答案。您不需要在自定义异常实现中添加 ClassInterfaceAttribute
或 ComVisibleAttribute
。如果我们查看 Exception class for .NET Framework,我们会看到:
[SerializableAttribute]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public class Exception : ISerializable, _Exception
在 Exception class for Silverlight,这个
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public class Exception
SerializableAttribute
不可用。
另一个区别是 Silverlight 的异常 class 只有 3 个构造函数。
构造函数 Exception(SerializationInfo, StreamingContext)
不可用。我们还可以在下面的 PCL 库中自定义异常实现的屏幕截图中看到,只有 3 个构造函数可用于异常。
没有您要创建的可用构造函数:
EncryptKeyNotFoundException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
因此,在 PCL 使用 DataContract 而不是 Serializable 的自定义异常实现中,将是这样的:
[DataContract]
public class EncryptKeyNotFoundException : System.Exception
{
public EncryptKeyNotFoundException() : base() { }
public EncryptKeyNotFoundException(string message) : base(message) { }
public EncryptKeyNotFoundException(string message, Exception innerException) : base(message, innerException) { }
}
我目前正在将我们的 .net 业务对象库转换为 PCL 文件,以便它可以与 Xamarin IOS/Android 一起使用,虽然它主要包含 POCO 对象,但它也包含自定义异常但这是抛出错误。
采用典型的自定义异常:
[Serializable]
public class EncryptKeyNotFoundException : Exception
{
public EncryptKeyNotFoundException()
: base() { }
public EncryptKeyNotFoundException(string message)
: base(message) { }
public EncryptKeyNotFoundException(string format, params object[] args)
: base(string.Format(format, args)) { }
public EncryptKeyNotFoundException(string message, Exception innerException)
: base(message, innerException) { }
public EncryptKeyNotFoundException(string format, Exception innerException, params object[] args)
: base(string.Format(format, args), innerException) { }
protected EncryptKeyNotFoundException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
}
不出所料,PCL 不喜欢 [Serializable]
和 SerializationInfo
。虽然我可能会坚持使用 [DataContract] 而不是使用 [Serialiable]
,但它仍然无法解决 SerializationInfo
的问题。
有没有什么办法可以绕过这个问题?
谢谢。
更新:
我已经按照建议查看了 Implementing custom exceptions in a Portable Class Library,但无法识别以下 2 个属性:
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
我一定是遗漏了对哪个程序集的引用?
我目前正在寻找 Portable class library: recommended replacement for [Serializable]
中提供的替代解决方案希望这会奏效。一旦我有更多信息要提供,我会更新我的答案。
更新:
ClassInterfaceAttribute
是 System.RunTime.InteroServices 的一部分,但我无法将其添加到我的 PCL 项目中,至少它是不可见的。我错过了什么吗?
另一篇文章提供了额外的信息,看起来在使用条件编译时,这应该可以工作,但是同样,虽然 json 库中的示例代码似乎可以工作,但我一定遗漏了一些东西,因为我无法添加引用以使 [Serializable]
不会引发错误,但我似乎无法这样做。
我试过的一件事就是简单地注释掉:
protected EncryptKeyNotFoundException(SerializationInfo info,
StreamingContext context) : base(info, context) { }
而且我可以编译我的 pcl 项目,所以问题是我需要这个吗?
谢谢。
我认为您误解了建议 link 中的答案。您不需要在自定义异常实现中添加 ClassInterfaceAttribute
或 ComVisibleAttribute
。如果我们查看 Exception class for .NET Framework,我们会看到:
[SerializableAttribute]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public class Exception : ISerializable, _Exception
在 Exception class for Silverlight,这个
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public class Exception
SerializableAttribute
不可用。
另一个区别是 Silverlight 的异常 class 只有 3 个构造函数。
构造函数 Exception(SerializationInfo, StreamingContext)
不可用。我们还可以在下面的 PCL 库中自定义异常实现的屏幕截图中看到,只有 3 个构造函数可用于异常。
没有您要创建的可用构造函数:
EncryptKeyNotFoundException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
因此,在 PCL 使用 DataContract 而不是 Serializable 的自定义异常实现中,将是这样的:
[DataContract]
public class EncryptKeyNotFoundException : System.Exception
{
public EncryptKeyNotFoundException() : base() { }
public EncryptKeyNotFoundException(string message) : base(message) { }
public EncryptKeyNotFoundException(string message, Exception innerException) : base(message, innerException) { }
}