Condividi tramite


Errore del compilatore CS1705

L'assembly 'AssemblyName1' usa 'TypeName' con una versione superiore rispetto all'assembly di riferimento 'AssemblyName2'.

Si accede a un tipo con un numero di versione superiore rispetto al numero di versione in un assembly a cui si fa riferimento. In genere, questo errore è causato dall'uso accidentale di due versioni dello stesso assembly.

Si supponga, ad esempio, di avere due assembly, Asmb1 e Asmb2. Assembly Asmb1 fa riferimento alla versione 1.0 dell'assembly Asmb2. Assembly Asmb1 usa anche una classe MyClass aggiunta all'assembly Asmb2 nella versione 2.0. Il compilatore dispone di regole di unificazione per i riferimenti di associazione e un riferimento a MyClass nella versione 2.0 non può essere soddisfatto dalla versione 1.0.

Esempi

L'esempio più dettagliato seguente è costituito da quattro moduli di codice:

  • Due DLL identiche, ad eccezione di un attributo version.
  • Terza DLL che fa riferimento ai primi due.
  • Un client che fa riferimento solo alla versione 1.0 delle DLL identiche, ma accede a una classe dalla versione 2.0.

Il codice seguente crea la prima delle DLL identiche. Per informazioni su come generare un file di chiave, vedere KeyFile (opzioni del compilatore C#).

// CS1705a.cs

// Compile by using the following command:
//      csc /target:library /out:C:\\CS1705.dll /keyfile:mykey.snk CS1705a.cs

// The DLL is created in the C:\ directory.

// The AssemblyVersion attribute specifies version 1.0 for this DLL.

[assembly:System.Reflection.AssemblyVersion("1.0")]
public class Class1
{
   public void Method1() {}
}

Il codice seguente definisce la versione 2.0 dell'assembly, come specificato dall'attributo AssemblyVersionAttribute .

// CS1705b.cs

// Compile by using the following command:
//     csc /target:library /out:CS1705.dll /keyfile:mykey.snk CS1705b.cs

// The DLL is created in the current directory.

// The AssemblyVersion attribute specifies version 2.0 for this DLL.

[assembly:System.Reflection.AssemblyVersion("2.0")]
public class Class1
{
    public void Method1() { }
}

Il codice seguente fa riferimento alle due versioni DLL definite nel codice precedente. AssemblyA fa riferimento alla DLL creata da CS1705a.cs (versione 1.0). AssemblyB fa riferimento alla DLL creata da CS1705b.cs (versione 2.0). In ClassCvengono definiti due metodi. Il primo, Return1A, restituisce un oggetto di tipo Class1A, che è un alias per Class1 dalla versione 1.0 della DLL. Il secondo, Return1B, restituisce un oggetto di tipo Class1B, che è un alias per Class1 dalla versione 2.0 della DLL. La definizione di Return1A crea una dipendenza dalla versione 1.0. La definizione di Return1B crea una dipendenza dalla versione 2.0.

// CS1705c.cs

// Compile by using the following command. AssemblyA refers to the DLL created by
// CS1705a.cs (version 1.0). AssemblyB refers to the DLL created by CS1705b.cs
// (version 2.0).
//    csc /target:library /r:AssemblyA=C:\\CS1705.dll /r:AssemblyB=CS1705.dll CS1705c.cs

extern alias AssemblyA;
extern alias AssemblyB;

// Class1A is an alias for type Class1 from VS1705a.cs, which is in version 1.0
// of the assembly. Class1B is an alias for type Class1 from CS1705b.cs, which
// is in version 2.0 of the assembly.

using Class1A = AssemblyA::Class1;
using Class1B = AssemblyB::Class1;

// Method Return1A in ClassC returns an object of type Class1A, which is
// Class1 from version 1.0 of the DLL. Method Return1B returns an object
// of type Class1B, which is Class1 from version 2.0 of the DLL.

public class ClassC
{
    // The following line creates a dependency on version 1.0 of CS1705.dll.
    // This is not the source of the problem when ClassC is accessed from
    // CS1705d.cs because CS1705d.cs references version 1.0 of the DLL.
    // Therefore, type Class1A and the assembly have the same version.
    public static Class1A Return1A() { return new Class1A(); }

    // The following line creates a dependency on version 2.0 of CS1705.dll.
    // This causes compiler error CS1705 when ClassC is accessed from
    // CS1705d.cs, because CS1705d.cs does not reference version 2.0 of the
    // DLL. Class1B is the alias for Class1 in version 2.0, and CS1705d.cs
    // references version 1.0.
    public static Class1B Return1B() { return new Class1B(); }
}

Il codice seguente genera l'errore del compilatore CS1705. Fa riferimento alla DLL creata da CS1705a.cs (versione 1.0). Tuttavia, nel metodo Main, il codice accede a ClassC da CS1705c.cs. ClassC usa un tipo che è definito in CS1705b.cs (versione 2.0). Ciò causa l'errore del compilatore CS1705 perché il tipo ha un numero di versione per CS1705.dll superiore alla versione di riferimento di CS1705.dll.

// CS1705d.cs

// Compile by using the following command:
//     csc /reference:C:\\CS1705.dll /reference:CS1705c.dll CS1705d.cs

// C:\\CS1705.dll is version 1.0 of the assembly.

class Tester
{
    static void Main()
    {
        // Return1A returns a type defined in version 1.0.
        ClassC.Return1A().Method1();
        // Return1B returns a type defined in version 2.0.
        ClassC.Return1B().Method1();
    }
}

È possibile risolvere l'errore in uno dei modi seguenti:

  • Aggiornare il codice in modo che tutti i file usino la stessa versione della DLL.

  • Aggiungere un riferimento alla versione 2.0 della DLL per CS1705d.cs usando il comando seguente per compilare:

    csc /reference:C:\\CS1705.dll /reference:CS1705.dll /reference:CS1705c.dll CS1705d.cs

    Anche se il programma viene compilato quando si usa questo comando, non viene ancora eseguito. Per consentire l'esecuzione del programma, è possibile fornire un file di configurazione dell'applicazione che include un <dependentAssembly> elemento che usa <assemblyIdentity> e <codeBase> elementi figlio per specificare il percorso della versione 1.0 della DLL. Per altre informazioni sui file di configurazione, vedere Configurazione delle app.

Vedere anche