2017-07-24 8 views
3

Ich habe eine Erweiterungsmethode, die ich seit Jahren in WinForms verwendet habe, aber nicht, seit ich versucht habe, es in einem neuen WPF-Projekt zu verwenden. Die Methode:Wie kann ich diese InvalidCastException vermeiden?

Der erste Chunk (der auskommentiert ist) ist die ursprüngliche Methode. Der zweite Teil ist eine etwas andere Version, mit der ich getestet habe. Wenn ich die Rückleitung mit der Besetzung Kraft auszuführen, erhalte ich diese Ausnahme:

InvalidCastException image

Der vollständige Wortlaut der Ausnahme von diesem Dialog:

Zusätzliche Informationen: [A] System .ComponentModel.DescriptionAttribute kann nicht in [B] System.ComponentModel.DescriptionAttribute umgewandelt werden. Typ A stammt von 'System.ComponentModel.Primitives, Version = 4.1.1.0, Culture = Neutral, PublicKeyToken = b03f5f7f11d50a3a' im Kontext 'Default' am Speicherort 'C: \ TFS_Local \ Antero \ AnteroWPF \ bin \ Debug \ System.ComponentModel .Primitives.dll '. Typ B stammt von 'System, Version = 4.0.0.0, Culture = Neutral, PublicKeyToken = b77a5c561934e089' im Kontext 'Standard' am Speicherort 'C: \ WINDOWS \ Microsoft.Net \ assembly \ GAC_MSIL \ System \ v4.0_4.0.0 .0__b77a5c561934e089 \ System.dll '.

die beiden Anordnungen scheinen beteiligt zu sein:

System.ComponentModel.Primitives.dll (existiert in der Build-Verzeichnis bin ... nicht ganz sicher, wie es dort ankam)

System.dll (direkt von GAC verwiesen, aus offensichtlichen Gründe)

Ich bin hier völlig verloren. Wenn ich das ComponentModel DLL entferne, wird das die Ausnahme. Auch wenn die Ausnahme behauptet, dass System vom Typ ist, scheint keine Verwendung davon möglich. I.e. System.ComponentModel.DescriptionAttribute scheint keine gültige Sache in Ermangelung der entsprechenden DLL zu tun.

Also, wenn ich eins entferne und das scheitert, und das andere ist vollständig unbrauchbar ... dann warum ist diese Ausnahme überhaupt aufgetreten ?!

EDIT: Ich denke, es lohnt sich nichts, wenn ich den Wert attributes im Speicher überprüfen, sehe ich, dass das Array ein einzelnes Element hat, und es ist vom Typ System.ComponentModel.DescriptionAttribute.

+0

Die Linie mit den Darstellern – DonBoitnott

+0

Es funktioniert gut für mich: https://github.com/heldersepu/csharp-proj/commit/c80e3e9828cb08c11cd17031fa10e6a4852878da#diff-225b67798e354b1ad8b608f72aa1ded5 – HelderSepu

+0

@HelderSepu Während Ihr Beispiel tatsächlich unvollständig ist (Ihre Enum-Werte tun keine beschreibenden Attribute haben), es funktioniert übrigens in dieser vereinfachten Form. Leider macht mir das den Unterschied nicht klar. – DonBoitnott

Antwort

2

Wenn ich die Component DLL entfernen, das wird die Ausnahme

Welche die Ausnahme wird?

Die Ausnahme, die Sie erhalten, ist zu 100% klar: Zwei verschiedene Assemblys, auf die Ihr Projekt verweist, definieren denselben Typ System.ComponentModel.DescriptionAttribute. Dieser Typ is documented as being defined in System.dll. So scheint die System.ComponentModel.Primitives.dll Versammlung der verdächtige zu sein.

Ein wenig Web-Suche führt mich dazu System.ComponentModel.Primitives NuGet package. Von dieser Beschreibung scheint dies mit .NET Core verwandt zu sein, und tatsächlich gibt es einen implementation of that type in the .NET Core source code.

Zum Zeitpunkt der Kompilierung scheint die Assembly in Ihrem Build-Verzeichnis C:\TFS_Local\Antero\AnteroWPF\bin\Debug platziert worden zu sein. Also, die Frage ist, wenn Sie ein WPF-Programm erstellen, warum haben Sie eine .NET Core Assembly im Build-Verzeichnis? Haben Sie das NuGet-Paket irgendwann installiert? Ihr Build-Verzeichnis enthält den Stamm TFS_Local, der darauf hinweist, dass Sie möglicherweise in einem Team Foundation Server-Repository eingetragen sind. Ist es möglich, dass ein Mitarbeiter das Paket für Ihren Build installiert hat?

Ich habe nichts gesehen, was mich glauben machen würde, dass Sie das Desktop .NET Framework mit .NET Core kombinieren können. Die kurze Antwort scheint mir einfach "mach das nicht". Sie erhalten möglicherweise andere Fehler ohne die System.ComponentModel.Primitives.dll Assembly verwiesen, aber Sie müssen diese auf eine andere Weise adressieren. Mir ist kein Grund bekannt zu glauben, dass Sie in der Lage sein sollten, ein Desktop-WPF-Programm mit .NET Core DLLs zu kompilieren.

Wenn Sie etwas anderes glauben, wäre es hilfreich, wenn Sie erklären würden, warum Sie eine .NET Core-Assembly in Ihrem WPF-Programm verwenden können, wie genau Sie das tun und welche Schritte Sie unternommen haben In .NET Core deklarierte Typen stehen nicht in Konflikt mit Typen, die in den Desktop-.NET Framework-Assemblys deklariert sind, einschließlich System.dll.

+0

Am Ende ist Ihre Spekulation, dass ein anderes Teammitglied die Änderung beigetragen hat, auf dem richtigen Weg. Die Assembly, die die Enumeration bereitstellt, wurde "portabel" gemacht, um mit einem mobilen Projekt zu arbeiten, und das führte dazu, dass die primitive DLL eingesaugt wurde, was zu der Ausnahme führte (und meine Verwirrung darüber, wie sie dort angekommen war). – DonBoitnott

0

Um dies zu beheben, leeren Sie die Ordner bin und obj. Setzen Sie copy local auf false für Ihre Referenzen vom GAC.

Verwandte Themen