ReSharper bietet unter Visual Studio 2010 keinen QuickFix für Type Mismatch bei COM Objekten – die Lösung

Written on April 12, 2010

Viele Neuerungen in Visual Studio 2010 / .NET 4.0, die für sich genommen gut sind, können in Ihrer Kombination zu Problemen führen...

Bis zum .NET Framework 3.5 musste man bei der Verwendung von COM Interop Assemblies viele Rückgabewerte von Methoden etc. explizit casten, z.B.

MathUtility mathUtility = (MathUtility)solidWorks.GetMathUtility();

Vergisst man den expliziten Cast, merkt man das beim Kompilieren:

missingcastcompiletime

Hat man ReSharper installiert, wird man bereits beim Tippen auf den Fehler hingewiesen:

ReSharper bemerkt den fehlenden Cast sofort beim Tippen

Außerdem bietet ReSharper auch gleich den passenden QuickFix via ALT+Enter an:

Die Lösung folgt bei ReSharper auf dem Fuß

Gestern hatte ich nun das Problem, dass genau dieses Verhalten in ReSharper nicht mehr funktionierte, d.h. kein Error -- kein QuickFix.

Allerdings trat der Fehler nur bei COM Interop Assemblies auf.

Der Klassiker

object o = "123";
string s = o;

funktionierte aber nach wie vor (d.h. wurde von ReSharper als fehlerhaft erkannt).

Visual Studio 2010 bemerkte den fehlenden Cast aber beim Kompilieren -- was war passiert?

Verwendet man Visual Studio 2010 und .NET Framework 4, hat man die Möglichkeit, auf den Cast zu verzichten, da mit .NET Framework 4 der Type dynamic eingeführt wurde.

Allerdings handelt es sich bei besagtem Projekt nicht um ein .NET Framework 4 Projekt, sondern um ein .NET Framework 3.5 Projekt.

Allerdings wurde das Projekt als .NET Framework 4 Projekt erstellt und später in den Projekteinstellungen auf .NET Framework 3.5 umgestellt:

zurück zu .NET Framework 3.5

Die Referenzen auf die COM Interop Assemblies, wurden allerdings gesetzt, als das Projekt noch auf .NET Framework 4 eingestellt war.

Refenzen auf COM Interop Assemblies

Und genau hier schlug die zweite Neuerung in Visual Studio 2010 zu.

Visual Studio 2010 bietet die Option für Embedded Interop Types beim Referenzieren von COM Interop Assemblies:

Embed Interop Types

Per default setzt Visual Studio diesen Wert bei .NET Framework 4 Projekten auf "True".

Setzt man das Projekt auf .NET Framework 3.5 zurück, verschwindet die Option zwar in den Properties für die referenzierte Assembly:

Keine Embedded InteropTypes sichtbar

Im Projekt-File bleibt der Parameter aber erhalten:

<embedinteroptypes>True</embedinteroptypes>

Eben dieser Eintrag führt dazu, dass ReSharper die Prüfung auf Type Mismatch bei der Verwendung von COM Interop Assemblies nicht mehr durchführt.

Für die Lösung des Problems gibt es zwei Ansätze:

  1. Projekt nochmal auf .NET Framework 4 zurücksetzen und "Embed Interop Types" auf "False" setzen. Projekt wieder auf .NET Framework 3.5 setzen

  2. Den Eintrag im Projekt-File von Hand auf False ändern.

Danke an Ilya Ryzhenkov von JetBrains für die Hilfe bei der Fehlersuche.