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:
Hat man ReSharper installiert, wird man bereits beim Tippen auf den Fehler hingewiesen:
Außerdem bietet ReSharper auch gleich den passenden QuickFix via ALT+Enter an:

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:
Die Referenzen auf die COM Interop Assemblies, wurden allerdings gesetzt, als das Projekt noch auf .NET Framework 4 eingestellt war.
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:
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:
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:
- Projekt nochmal auf .NET Framework 4 zurücksetzen und “Embed Interop Types” auf “False” setzen. Projekt wieder auf .NET Framework 3.5 setzen
- Den Eintrag im Projekt-File von Hand auf False ändern.
Danke an Ilya Ryzhenkov von JetBrains für die Hilfe bei der Fehlersuche.
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5