9

Ich konvertiere derzeit unsere .net Business-Objekte Bibliothek in eine PCL-Datei, so dass es mit Xamarin IOS/Android verwendet werden kann und während es hauptsächlich POCO-Objekte enthält, enthält es auch benutzerdefinierte Ausnahmen, aber das ist Wurffehler.Benutzerdefinierte Ausnahmen in PCL-Dateien

eine typische Angepasste Exception Nehmen:

[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) { } 
} 

Da die PCL nicht [Serializable] und SerializationInfo erwartet mag. Während ich mit dem Festhalten von [DataContract] statt [Serialiable] davonkommen könnte, wird das Problem mit SerializationInfo immer noch nicht gelöst.

Gibt es trotzdem eine Umgehung dieses Problems?

Danke.

Update:

Ich habe einen Blick auf Implementing custom exceptions in a Portable Class Library hatte, wie vorgeschlagen, aber die folgenden zwei Attribute nicht erkannt werden:

[ClassInterfaceAttribute(ClassInterfaceType.None)] 
[ComVisibleAttribute(true)] 

Ich muss aber einen Verweis fehlt, auf die Montage?

suche ich zur Zeit an einer alternativen Lösung als Portable class library: recommended replacement for [Serializable]

in bereitgestellt Hoffentlich funktioniert. Ich werde meine Antwort aktualisieren, sobald ich weitere Informationen zur Verfügung habe.

Update:

ClassInterfaceAttribute Teil der System.RunTime.InteroServices ist, aber ich kann das mein PCL Projekt nicht hinzufügen, gut zumindest nicht sichtbar ist. Fehle ich etwas? Der andere Artikel liefert zusätzliche Informationen und es sieht so aus, als ob bei der bedingten Kompilierung das funktioniert, aber während der Beispielcode aus der json-Bibliothek zu funktionieren scheint, muss mir etwas fehlen, da ich keine Referenz hinzufügen kann so dass [Serializable] keinen Fehler wirft, aber ich bin nicht in der Lage, dies zu tun.

Eines, was ich versucht habe, ist einfach auf Kommentar:

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

Und ich kann mein pcl Projekt ok kompilieren, so die Frage ist, kann ich dies tun müssen?

Danke.

+2

Ich denke, das ist hilfreich für Sie [Implementieren von benutzerdefinierten Ausnahmen in einer Portable Class Library] (http://stackoverflow.com/questions/13604713/implementing-custom-exceptions-in-a-portable-class-library) –

+0

Ich hatte diesen Artikel gefunden, fand ihn aber nicht relevant. Ich werde es versuchen und aktualisieren, wenn Sie fertig sind. Vielen Dank. – Thierry

+0

Ich habe meine Antwort aktualisiert, aber leider hilft es nicht. Fehle ich etwas? – Thierry

Antwort

1

Ich denke, Sie haben die Antwort in vorgeschlagenen Link fehlinterpretiert. Sie müssen ClassInterfaceAttribute oder ComVisibleAttribute in Ihrer benutzerdefinierten Ausnahmeimplementierung nicht hinzufügen. Wenn wir in Exception class for .NET Framework suchen wir sehen:

[SerializableAttribute] 
[ClassInterfaceAttribute(ClassInterfaceType.None)] 
[ComVisibleAttribute(true)] 
public class Exception : ISerializable, _Exception 

und bei Exception class for Silverlight dieses

[ClassInterfaceAttribute(ClassInterfaceType.None)] 
[ComVisibleAttribute(true)] 
public class Exception 

SerializableAttribute nicht verfügbar ist.

Ein weiterer Unterschied ist, dass die Exception-Klasse für Silverlight nur 3 Konstruktoren hat. Konstruktor Exception(SerializationInfo, StreamingContext) ist nicht verfügbar. Und außerdem können wir unten in Screenshot der benutzerdefinierten Ausnahmeimplementierung in PCL-Bibliothek sehen, dass nur 3 Konstruktoren für Ausnahme verfügbar sind. Es gibt keinen Konstruktor zur Verfügung, die Sie versuchen, zu erstellen:

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

enter image description here

in PCL benutzerdefinierte Ausnahme Implementierung mit Datacontract Anstatt also Serializable, wäre so etwas wie dies:

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

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

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

Hallo Mak, danke für die ausführliche Erläuterung. Wenn Sie sich meine aktualisierte Frage ansehen, ist es das, was ich getan habe, nämlich die überladene Methode loszuwerden, die die SerializationInfo verwendet hat. – Thierry

+0

Ja, Sie hatten eine funktionierende Lösung, aber ich dachte, das wäre hilfreich, um zu verstehen, warum es so ist. :) –

+1

Stimme völlig mit dir & danke dafür! Lerne heute etwas Neues! – Thierry