9

Attualmente sto convertendo la nostra libreria di oggetti di business .net in un file PCL in modo che possa essere utilizzata con Xamarin IOS/Android e mentre contiene principalmente oggetti POCO, contiene anche eccezioni personalizzate ma questo è errori di lancio.Eccezioni personalizzate nei file PCL

Prendere una tipica eccezione personalizzata:

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

Come previsto il PCL non piace [Serializable] e SerializationInfo. Anche se potrei farla franca attaccando [DataContract] invece di usare [Serialiable], non risolverà comunque il problema con SerializationInfo.

C'è comunque un modo per aggirare questo problema?

Grazie.

Aggiornamento:

ho avuto uno sguardo al Implementing custom exceptions in a Portable Class Library come suggerito, ma i seguenti 2 attributi non vengono riconosciuti:

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

Devo mancare un riferimento, ma a cui il montaggio?

Attualmente sto guardando una soluzione alternativa, come previsto in Portable class library: recommended replacement for [Serializable]

Speriamo che questo funzionerà. Aggiornerò la mia risposta una volta che avrò più informazioni da fornire.

Aggiornamento:

ClassInterfaceAttribute fa parte dei System.RunTime.InteroServices ma non posso aggiungere questo al mio progetto PCL, beh almeno non è visibile. Mi sto perdendo qualcosa?

L'altro articolo fornisce ulteriori informazioni e sembra che quando si utilizza la compilazione condizionale, questo dovrebbe funzionare, ma ancora una volta, mentre il codice di esempio dalla libreria JSON sembra funzionare, devo essere perso qualcosa come non posso aggiungere un riferimento in modo che [Serializable] non genera un errore, ma non sembra che sia in grado di farlo.

Una cosa che ho provato è quella di commentare semplicemente fuori:

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

E mi può compilare il mio progetto PCL ok, quindi la domanda è: ho bisogno di questo?

Grazie.

+2

Penso che ciò sarà utile per te [Implementazione di eccezioni personalizzate in una libreria di classi portatile] (http://stackoverflow.com/questions/13604713/implementing-custom-exceptions-in-a-portable-class-library) –

+0

Avevo trovato questo articolo ma non pensavo fosse pertinente. Darò un colpo e l'aggiornamento quando fatto. Grazie. – Thierry

+0

Ho aggiornato la mia risposta ma sfortunatamente non aiuta. Mi sto perdendo qualcosa? – Thierry

risposta

1

Penso che tu abbia interpretato erroneamente la risposta nel link suggerito. Non è necessario aggiungere ClassInterfaceAttribute o ComVisibleAttribute nell'implementazione di eccezione personalizzata. Se guardiamo in Exception class for .NET Framework vediamo:

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

ea Exception class for Silverlight, questo

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

SerializableAttribute non è disponibile.

Un'altra differenza è che la classe Exception per Silverlight ha solo 3 costruttori. Il costruttore Exception(SerializationInfo, StreamingContext) non è disponibile. E possiamo anche vedere nello screenshot sottostante l'implementazione di eccezioni personalizzate nella libreria PCL che solo 3 costruttori sono disponibili per Eccezione. Non esiste costruttore a disposizione che si sta tentando di creare:

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

enter image description here

Così, in PCL implementazione eccezione personalizzata con DataContract invece di Serializable, sarebbe qualcosa di simile:

[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

Ciao Mak, grazie per il chiarimento dettagliato. Se guardi la mia domanda aggiornata, questo è quello che ho finito facendo, per esempio, sbarazzarmi del metodo sovraccarico che utilizzava SerializationInfo. – Thierry

+0

Sì, sei finito con una soluzione di lavoro, ma ho pensato che sarebbe stato utile capire perché è così. :) –

+1

Totalmente d'accordo con te e grazie per quello! Impara qualcosa di nuovo oggi! – Thierry

Problemi correlati