106 votes

Le type existe dans 2 assemblages

J'ai créé deux assemblies .NET Interop à partir de deux DLL COM tierces différentes. Les deux DLL COM contenaient un type nommé COMMONTYPE. Par conséquent, COMMONTYPE est maintenant exposé à travers les deux assemblies Interop également.

J'ai un troisième projet qui a besoin d'utiliser ces deux assemblies Interop, et je reçois l'erreur de compilation infâme :

Le type existe à la fois dans et

Étant donné que les DLL COM sont fournies par un fournisseur tiers, je n'ai pas accès au code source, et je suis en train d'écrire une application console C#, ce qui signifie que je n'ai pas de fichier web.config où je pourrais ajouter le contournement debug=false. Que puis-je faire?

232voto

Tom Bonner Points 356

Je sais que cela est ancien, mais il y a une façon plus facile que celle indiquée. Cela fonctionne lorsque vous référencez deux assemblies qui partagent des types avec le même nom et espace de noms.

Si vous cliquez avec le bouton droit sur la référence à votre DLL et sélectionnez Propriétés, vous verrez qu'il y a une propriété appelée "Alias".

entrer la description de l'image ici

La valeur par défaut est "global". Pour l'un des assemblies en conflit, changez ceci pour toute autre valeur. Dans l'exemple ci-dessous, je l'ai changé de "global" à "destination".

Ensuite, dans votre fichier de code, vous devrez utiliser le mot-clé externe pour utiliser cet alias en tant que espace de noms de niveau supérieur pour ces types. Dans cet exemple, vous placeriez ce qui suit en haut de votre fichier .cs :

extern alias destination

Maintenant, dans ce fichier, vous pouvez référencer les deux types.

extern alias destination;
namespace Test
{
    public static class TestClass
    {
        public static void Success()
        {
            var foo = destination::Some.Duplicate.Namespace.SomeDuplicateType();
            var bar = Some.Duplicate.Namespace.SomeDuplicateType();
        }
    }
}

Ou, si vous avez seulement besoin d'un type dans une classe, vous pouvez également utiliser using pour l'espace de noms :

extern alias destination;
using destination::Some.Duplicate.Namespace;
namespace Test
{
    public static class TestClass
    {
        public static void Success()
        {
            var foo = SomeDuplicateType();
        }
    }
}

21voto

Zunair Points 16

Ancienne question mais j'ai trouvé une option plus facile... Sélectionnez la référence que vous voulez utiliser... Sous propriétés, changez les alias en 'xyz' Maintenant dans la ligne de code, ajoutez en haut :

extern alias xyz;

ensuite ajoutez l'utilisation de :

using xyz.VENDOR2.Type;

ou une autre façon d'utiliser using :

using OtherNameSpace = xyz.VENDOR2.Type;

maintenant vous devriez pouvoir utiliser la référence explicitement comme ci-dessous :

var abc = new xyz.VENDOR2.Type.abc();

ou

var abc = new OtherNameSpace.abc();

13voto

Joel Etherton Points 24155

À moins que les espaces de noms des vendeurs soient identiques (peu probable), les définitions de type seront en fait séparées à ce moment-là. Ce que vous devrez faire (et cela peut parfois être une vraie galère) est de créer un alias d'espace de noms dans votre instruction using plutôt que d'appliquer simplement l'instruction carte blanche. Cela vous permettra de ré-identifier les espaces de noms :

using Vendeur1 = Vendeur.EspaceDeNoms;
using Vendeur2 = AutreVendeur.EspaceDeNoms;

...

Vendeur1.TYPECOMMUN blah = new Vendeur1.TYPECOMMUN();
Vendeur2.TYPECOMMUN blah2 = new Vendeur2.TYPECOMMUN();

Cela signifiera l'utilisation de l'alias spécifique pour tous les types situés dans chaque espace de noms de ces vendeurs.

8voto

Denis Points 2122

Je sais que c'est vieux mais je suis tombé dessus récemment. La meilleure façon que j'ai trouvée pour corriger cela est de modifier le fichier YourProjectName.csproj en ajoutant ce qui suit :

            NewAliasForNamespace

1voto

Igarioshka Points 669

Vous pouvez utiliser des alias pour les différents espaces de noms et/ou types :

voici à quoi cela ressemblerait :

using other = sssssss.a;
namespace ConsoleApplication1
{
    public class a 
    {
        public string ff { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            other s = new other();
            a b = new a();
        }
    }
}
namespace sssssss 
{

    public class a
    {
        public string ff { get; set; }
    }
}

MSDN

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X