Ich habe zwei .NET Interop-Assemblys aus zwei verschiedenen COM-DLLs von Drittanbietern erstellt. Beide COM-DLLs enthielten einen Typ namens COMMONTYPE
. Daher COMMONTYPE
wird jetzt auch durch die beiden Interop-Baugruppen belichtet.
Ich habe ein drittes Projekt, das diese beiden Interop-Assemblys verwenden muss, und ich erhalte den berüchtigten Fehler bei der Kompilierungszeit:
Der Typ
<ABC>
existiert in<ASSEMBLY1.dll>
und<ASSEMBLY2.dll>
Da die COM-DLLs von einem Drittanbieter bereitgestellt werden, habe ich keinen Zugriff auf den Quellcode und schreibe eine C # -Konsolenanwendung. Dies bedeutet, dass ich keine web.config-Datei habe, in der ich die Problemumgehung hinzufügen könnte debug=false
. Was kann ich tun?
c#
com-interop
Kou S Hal
quelle
quelle
Antworten:
Ich weiß, dass dies alt ist, aber es gibt einen einfacheren Weg als den aufgeführten. Dies funktioniert, wenn Sie auf zwei Assemblys verweisen , die Typen mit genau demselben Namen und Namespace gemeinsam nutzen.
Wenn Sie mit der rechten Maustaste auf den Verweis auf Ihre DLL klicken und Eigenschaften auswählen, sehen Sie, dass hier eine Eigenschaft namens "Aliase" ist.
Der Standardwert ist "global" . Ändern Sie dies für eine der in Konflikt stehenden Assemblys in einen anderen Wert. Im folgenden Beispiel habe ich es von "global" in "Ziel" geändert.
Als Nächstes müssen Sie in Ihrer Codedatei das Schlüsselwort extern verwenden , um diesen Alias als Namespace auf Stammebene für diese Typen zu verwenden. In diesem Beispiel würden Sie Folgendes oben in Ihre CS-Datei einfügen:
extern alias destination
In dieser Datei können Sie nun auf beide Typen verweisen.
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(); } } }
quelle
Sofern die Namespaces der Anbieter nicht identisch sind (unwahrscheinlich), sind die Typdefinitionen zu diesem Zeitpunkt tatsächlich getrennt. Was Sie tun müssen (und dies ist manchmal eine vollständige PITA), ist, einen Namespace-Alias in Ihrer using-Anweisung zu erstellen, anstatt einfach die Anweisung carte blanche anzuwenden. Auf diese Weise können Sie die Namespaces neu identifizieren:
using Vendor1 = Vendor.Namespace; using Vendor2 = OtherVendor.Namespace; ... Vendor1.COMMONTYPE blah = new Vendor1.COMMONTYPE(); Vendor2.COMMONTYPE blah2 = new Vendor2.COMMONTYPE();
Dies bedeutet, dass für diese Anbieter der spezifische Alias für alle Typen in jedem Namespace verwendet wird.
quelle
Alte Frage, aber eine einfachere Option gefunden ... Wählen Sie die Referenz aus, die Sie verwenden möchten ... Ändern Sie unter Eigenschaften die Aliase in 'xyz'. Jetzt in der Codezeile oben hinzufügen:
extern alias xyz;
Fügen Sie dann Folgendes hinzu:
using xyz.VENDOR2.Type;
oder eine andere Art der Verwendung mit:
using OtherNameSpace = xyz.VENDOR2.Type;
Jetzt sollten Sie in der Lage sein, die Referenz wie folgt explizit zu verwenden:
var abc = new xyz.VENDOR2.Type.abc();
oder
var abc = new OtherNameSpace.abc();
quelle
Sie können Aliase für die verschiedenen Namespaces und / oder Typen verwenden:
So würde es aussehen:
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
quelle
Vielleicht können Sie es austricksen, indem Sie eine
namespace
der Assemblys ändern. In diesem Fall ist der vollständig qualifizierte Name einer AssemblyCOMMONTYPE
nicht gleich einer anderen, und möglicherweise kann dies Ihr Problem mit Konflikten in der 3. DLL lösen.Hoffe das hilft.
quelle