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 中的答案。您不需要在自定义异常实现中添加 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 的异常 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) { }
}