Domanda

Lasciami dare uno scenario, quindi vedi se qualcuno ha una soluzione / soluzione.

Ho una libreria (DLL) che contiene solo classi. In un'altra libreria, ho interfacce che implementano le classi nella prima libreria. I clienti faranno sempre riferimento a una sola versione della libreria contenente le interfacce (sempre la più recente) e verranno fatte solo aggiunte a tali interfacce (più interfacce / metodi). Inoltre, ci sarà solo una versione di quella libreria di interfacce - in modo che i client non debbano aggiornare i riferimenti (la libreria di interfacce verrà caricata tramite reflection - quindi non si applicano le normali regole di sondaggio, possiamo caricare solo ciò che il client specificamente chiede). La libreria che implementa le interfacce avrà più versioni a cui fanno riferimento diversi client contemporaneamente.

Il problema si verifica quando un assembly client fa riferimento a una versione precedente della libreria di implementazione. Crea un oggetto da un tipo di classe nella libreria di implementazione, quindi lo passa a un altro assembly client. Quell'assembly client utilizza l'ultima (e unica) versione della libreria di interfacce e tenta di trasmettere l'oggetto passato ad esso con il tipo di interfaccia appropriato. Questo cast ha esito negativo con l'eccezione "System.TypeLoadException: il metodo X nel tipo Y dall'assembly Z non ha un'implementazione". Mi aspettavo questa eccezione perché nella nuova versione dell'interfaccia (stesso numero di versione - vecchia libreria bloccata), il metodo X è definito, ma anche se la vecchia versione dell'oggetto passato contiene metadati che dicono che implementa l'interfaccia corrispondente, il la mappatura non riesce sul nuovo metodo di interfaccia X perché non ha alcuna implementazione in quella classe.

Quindi, la mia domanda è questa; Esiste un modo per fare in modo che un client utilizzi quell'interfaccia, ma causi un'eccezione solo quando viene chiamato un metodo che non è implementato sull'oggetto referenziato (piuttosto che l'eccezione generata quando l'oggetto referenziato viene trasmesso al nuovo tipo di interfaccia)?

A proposito - l'associazione tardiva non è un'opzione perché vogliamo il controllo del tipo di tempo intellisense / compilazione ... Inoltre, so come fare questo con i puntatori a funzione e le classi wrapper - Speravo solo una soluzione migliore che è più in sintonia con i normali tipi .NET.

Grazie - Qualsiasi aiuto è molto apprezzato

È stato utile?

Soluzione

È possibile utilizzare una classe astratta (MustInherit) anziché un'interfaccia nella libreria contenente le interfacce e impostare i metodi e le proprietà come Sostituibili. In questo modo, anche se i metodi generassero un'eccezione non implementata, ci sarebbe sempre un'implementazione per ogni metodo nella libreria dell'interfaccia. Rendendo i metodi Overridable anziché MustOverride dovrebbe evitare TypeLoadException.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top