PCL文件中的自定义例外

时间:2015-08-19 12:59:07

标签: c# xamarin xamarin.ios xamarin.android portable-class-library

我目前正在将.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项目,所以问题是我需要这个吗?

感谢。

1 个答案:

答案 0 :(得分:1)

我认为您在建议的链接中误解了答案。您不需要在自定义异常实施中添加ClassInterfaceAttributeComVisibleAttribute。如果我们查看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的Exception类只有3个构造函数。 构造函数Exception(SerializationInfo, StreamingContext)不可用。我们还可以在下面的PCL库中看到自定义异常实现的屏幕截图,其中只有3个构造函数可用于Exception。 您没有尝试创建此类构造函数:

EncryptKeyNotFoundException(SerializationInfo info, StreamingContext context)
   : base(info, context) { }

enter image description here

因此,在使用DataContract而不是Serializable的PCL自定义异常实现中,将是这样的:

[DataContract]
public class EncryptKeyNotFoundException : System.Exception
{
    public EncryptKeyNotFoundException() : base() { }

    public EncryptKeyNotFoundException(string message) : base(message) { }

    public EncryptKeyNotFoundException(string message, Exception innerException) : base(message, innerException) { }
}