Domanda

È possibile creare una libreria che può essere consumata da .Net 2.0 e consente anche ai consumatori .Net 3.0+ di beneficiare di DataContracts se lo desiderano?

Non vedo alcun ostacolo tecnico per questo se non la libreria che contiene i diversi attributi relativi a DataContract è una libreria .Net 3.0. Questi attributi possono essere implementati manualmente in modo simile a ExtensionMethodAttribute?

È stato utile?

Soluzione

Se si aggiungono gli attributi .NET 3.0 a un assembly, quindi si esegue questo su un computer solo con .NET 2.0, ciò equivale ad avere un attributo sul codice da un assembly che non è disponibile in fase di esecuzione.

Funzionerà principalmente fino a quando l'applicazione .NET 2.0 non tenterà effettivamente di leggere gli attributi. Ad esempio, il codice seguente genererà FileNotFoundException perché non riuscirà a caricare System.ServiceModel.dll se eseguito su un computer con .NET 2.0:

[ServiceContract] // Attribute from System.ServiceModel.dll
class MyClass
{
  ...
}
...
    // this will throw a FileNotFoundException if System.ServiceModel.dll is not available
    object[] attributes = typeof(MyClass).GetCustomAttributes(false);

Pertanto, se non sai chi consumerà la tua biblioteca di classe, non puoi garantire al 100% che non li romperai.

Quanto sopra può essere evitato inviando una copia di System.ServiceModel.dll (o altro assembly contenente gli attributi che stai utilizzando) con la tua applicazione, o (credo) utilizzando il sovraccarico di GetCustomAttributes che accetta un System.Type argomento, quindi leggi solo gli attributi che sono noti per essere disponibili.

Altri suggerimenti

Poiché .NET 2.0 e .NET 3.0 e 3.5 utilizzano lo stesso CLR (2.0), non dovresti avere alcuna difficoltà.

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