Share via


Scrittura di codice compatibile con CLS

Aggiornamento: novembre 2007

La compatibilità con CLS (Common Language Specification) si riferisce solitamente al rispetto delle regole e delle restrizioni definite da CLS. Il concetto ha tuttavia un significato più specifico, a seconda che la definizione di compatibile con CLS si riferisca al codice o a uno strumento di sviluppo quale un compilatore. Gli strumenti di sviluppo compatibili con CLS possono facilitare la scrittura di codice compatibile con CLS.

Codice compatibile con CLS

Se si desidera che il proprio codice sia compatibile con CLS, occorre esporre le funzionalità secondo i canoni della compatibilità con CLS nei seguenti punti:

  • Definizioni delle classi pubbliche.

  • Definizioni dei membri pubblici delle classi pubbliche e dei membri accessibili alle classi derivate (accesso family).

  • Parametri e tipi restituiti dei metodi pubblici delle classi pubbliche e dei metodi accessibili alle classi derivate.

Non è necessario che le funzionalità utilizzate nelle definizioni delle proprie classi private, nelle definizioni dei metodi privati su classi pubbliche e nelle variabili locali osservino le regole CLS. È inoltre possibile scrivere il codice che implementa le proprie classi utilizzando funzionalità di qualsiasi linguaggio e producendo comunque un componente compatibile con CLS.

Nota:

Le matrici di matrici sono compatibili con CLS. In .NET Framework versione 1.0 il compilatore C# segnala per errore che non sono compatibili.

È possibile contrassegnare assembly, moduli, tipi e membri come compatibili con CLS o non compatibili con CLS utilizzando CLSCompliantAttribute. Tutti gli assembly che si desidera rendere compatibili con CLS dovranno essere contrassegnati come tali. Un assembly che non è contrassegnato come compatibile con CLS è considerato non compatibile con CLS. Se a un tipo non viene applicato alcun attributo CLS, tale tipo verrà considerato come avente la stessa compatibilità con CLS dell'assembly in cui è definito. Analogamente, se a un membro non viene applicato alcun attributo CLS, il membro verrà considerato come avente la stessa compatibilità con CLS del tipo che lo definisce. Non è possibile contrassegnare come compatibile con CLS un programma che include elementi non contrassegnati come compatibili con CLS. Nell'esempio riportato alla fine di questo argomento viene illustrato l'utilizzo di CLSCompliantAttribute.

Assembly, moduli e tipi possono essere compatibili con CLS anche se alcune parti relative non sono tali, purché vengano rispettate due condizioni:

  • Se l'elemento è contrassegnato come compatibile con CLS, le parti non compatibili con CLS devono essere contrassegnate utilizzando CLSCompliantAttribute con l'argomento false.

  • Per ciascun membro non compatibile con CLS deve essere fornito un corrispondente membro alternativo compatibile con CLS.

Se si progetta una libreria di classi compatibile con CLS, questa potrà interagire con un'ampia gamma di linguaggi di programmazione. È pertanto prevedibile che tale libreria disporrà di una clientela potenziale più ampia di quella che potrebbe avere una corrispondente versione non compatibile con CLS.

.NET Framework fornisce una libreria di classi compatibile con CLS. Per ulteriori informazioni sull'utilizzo di questa libreria di classi, vedere Riferimento alla libreria di classi .NET Framework.

Strumenti compatibili con CLS

I linguaggi che si avvalgono del runtime supportano le funzionalità di CLS e osservano le regole delle specifiche CLS per i compilatori. I compilatori per tali linguaggi semplificano il conseguimento della compatibilità con CLS mettendo i tipi di dati e le funzionalità di CLS a disposizione degli sviluppatori che creano componenti. I livelli di compatibilità con CLS offerti da compilatori e altri strumenti sono descritti di seguito:

  • Strumenti consumatori compatibili con CLS.

    Gli strumenti consumatori sono linguaggi che consentono agli sviluppatori di accedere a tutte le funzionalità fornite dalle librerie compatibili con CLS. Gli sviluppatori che utilizzano tali linguaggi potrebbero non essere in grado di estendere le librerie compatibili con CLS tramite la creazione di nuovi tipi, ma possono utilizzare tutti i tipi definiti in una libreria compatibile. Tale livello di compatibilità può essere utile quando si desidera accedere alla libreria di classi .NET Framework, ma non occorre creare nuovi oggetti che potranno essere utilizzati da altri, così come avviene quando si utilizzano Web Form su una pagina ASP.NET o quando si crea un'interfaccia utente Windows Form.

  • Strumenti di estensione compatibili con CLS.

    Gli strumenti di estensione sono linguaggi che consentono agli sviluppatori sia di utilizzare che di estendere i tipi definiti nelle librerie compatibili con CLS. Gli sviluppatori possono utilizzare i tipi esistenti o definirne di nuovi. Gli strumenti di estensione devono seguire tutte le regole a cui sono soggetti gli strumenti di tipo consumer, nonché alcune regole aggiuntive descritte nella specifica relativa a Common Language Infrastructure, Partition I - Architecture, disponibile nel sito Web Microsoft Developer Network (informazioni in lingua inglese).

Per la progettazione dei propri componenti compatibili con CLS, può essere utile utilizzare uno strumento compatibile con CLS. La scrittura di componenti compatibili con CLS senza tale supporto risulta più difficile perché si potrebbe non disporre di tutte le funzionalità di CLS che si desidera utilizzare.

Alcuni compilatori di linguaggi compatibili con CLS, quali il compilatore C# o Visual Basic, consentono di specificare che si desidera produrre codice compatibile con CLS. Tali compilatori possono verificare la compatibilità con CLS ed emettere un avviso quando il codice creato utilizza funzionalità non supportate da CLS. I compilatori C# e Visual Basic consentono di contrassegnare un elemento del programma come compatibile con CLS. La mancanza di tale contrassegno induce il compilatore a generare un errore in fase di compilazione. Il codice seguente, ad esempio, genera un avviso del compilatore:

<Assembly: CLSCompliant(True)>

<CLSCompliant(True)> Public Class MyCompliantClass
   Public Sub ChangeValue(value As UInt32)
   End Sub

   Public Shared Sub Main()
      Dim i As Integer = 2
      Console.WriteLine(i)
   End Sub   
End Class
using System;

// Assembly marked as compliant.
[assembly: CLSCompliant(true)]

// Class marked as compliant.
[CLSCompliant(true)]
public class MyCompliantClass {
   // ChangeValue exposes UInt32, which is not in CLS.
   // A compile-time warning results.
   public void ChangeValue(UInt32 value){ }

   public static void Main( ) {
   int i = 2;
   Console.WriteLine(i);
   }
}

Il codice genera l'avviso C# seguente:

warning CS3001: Argument type 'uint' is not CLS-compliant

o l'avviso Visual Basic seguente:

warning BC40028: Type of parameter 'value' is not CLS-compliant.

Per non generare l'avviso, è sufficiente indicare che ChangeValue non è compatibile, come illustrato nell'esempio seguente.

' Assembly marked as compliant.
<Assembly: CLSCompliant(True)>

' Class marked as compliant.
<CLSCompliant(True)> Public Class MyCompliantClass
   ' Method marked as not compliant.
   <CLSCompliant(False)> Public Sub ChangeValue(value As UInt32)
   End Sub

   Public Shared Sub Main()
      Dim i As Integer = 2
      Console.WriteLine(i)
   End Sub   
End Class
using System;

// Assembly marked as compliant.
[assembly: CLSCompliantAttribute(true)]

// Class marked as compliant.
[CLSCompliantAttribute(true)]
public class MyCompliantClass {
   // Method marked as not compliant.
   [CLSCompliantAttribute(false)]
   public void ChangeValue(UInt32 value){ }

   public static void Main( ) {
   int i = 2;
   Console.WriteLine(i);
   }
}

Questo codice non produce avvisi del compilatore. L'output è 2.

Per ulteriori informazioni su come specificare la compatibilità del proprio codice con CLS, vedere la documentazione del compilatore del linguaggio che si utilizza.

Vedere anche

Concetti

Cenni preliminari sull'interoperabilità dei linguaggi

Altre risorse

Interoperabilità tra linguaggi diversi