tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
500
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    luigied luigied ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    77
    Guten Morgen @all,

    ich glaube, ich sehe zur Zeit mal wieder den Wald vor lauter Bäumen nicht.

    Ich habe in VB .NET eine Klasse ClassicAuthentication, welche ein Interface IAuthentication implementiert. Beide liegen in einer dll.

    Wenn ich jetzt in meinem Hauptprogramm allerdings diese nutzen will bekomme ich eine InvalidCastException.

    Code :
    1
    2
    3
    
    Dim auth As IAuthentication = New ClassicAuthentication()
                auth.setParams(params)
                Dim oo As Object() = {src.getParam("IP"), CType(src.getParam("Port"), Short), DirectCast(auth, IAuthentication), src.makeParamString}

    Bei dem DirectCast wird mir die Exception geworfen. Weiss jemand, woran das liegen könnte?

    Danke, schonmal.

    Mfg LuigiEd
     

  2. #2
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi

    Wenn ich es richtig verstanden hab, erfordert DirectCast einen Typ als zweiten Parameter. Ein Interface stellt jedoch keinen Typ dar.

    Ich frag mich aber, warum du casten willst. "auth" hat doch schon den "Zieltyp"
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  3. #3
    luigied luigied ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    77
    Es sollen später noch weitere Klassen, die IAuthentication implementieren hinzugefügt werden. Ich möchte hier verschiedene Klassen als dll laden, die alle ebenfalls ein Interface (IConnector) implementieren. Bei diesem ist festgelegt, dass die connect-Methode der implementierenden Klasse unter anderem einen Parameter, der die Authentifikation darstellt besitzt. Da es aber verschiedene Authentifizierungsarten gibt (geben soll). Muss der methode eine Klasse, die das IAthentification-Interface implementiert übergeben werden.

    Oder gibt es noch einen Weg das anders zu machen?

    mfg

    Edit: Zieltyp sollte etwas allgemeineres sein, als die konkrete Umsetzung der Authentification. Damit ich das dann, egal, welche konkrete Auth von dem Konnektor verwendet wird , über das Interface auf dessen Methoden zugreifen kann.

    In Java kann ich eine Klasse über ein Interface casten
    Geändert von luigied (26.06.11 um 11:12 Uhr)
     

  4. #4
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Aber dafür musst du doch nicht casten.
    Du hast ein IAuthentication-Objekt, deine Methode erwartet ein IAuthentication-Objekt
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  5. #5
    luigied luigied ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    77
    Ja, ursprünglich war ich auch dieser Meinung. Habe für diesen speziellen fall zwar jetzt ein notdürftiges workaround gefunden, aber an einer anderen Stelle taucht das Gleiche Problem wieder auf.

    Code :
    1
    
    Dim conn As IConnector = ConnectorMap(Id)

    In der ConnectorMap steckt bis dahin ein Objekt von MSSQLConnector.Connectors.MSSQLConnector. Doch an dieser Stelle bekomme ich folgende Exception:

    Das Objekt des Typs "MSSQLConnector.Connectors.MSSQLConnector" kann nicht in Typ "BasicConnector.IConnector" umgewandelt werden.
    Mein MSSQLConnector implementiert allerdings IConnector und sollte deshalb auch in diesen umgewandelt werden können.

    Das dürfte doch theoretisch kein Problem sein, oder?

    Sollte ich vlt. erwähnen, dass sowohl das Interface, als auch die implemetierende Klasse in externen Bibliotheken liegen? Auf die Interface-Assembly wird jeweils von dem MSSQLConnector- und meinem Hauptprojekt verwiesen.
    Der MSSQLConnector liegt dann als Assmbly vor und wird über Reflection geladen nd instanziiert.

    mfg
    Geändert von luigied (27.06.11 um 13:00 Uhr)
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Nico Graichen Beitrag anzeigen
    Wenn ich es richtig verstanden hab, erfordert DirectCast einen Typ als zweiten Parameter. Ein Interface stellt jedoch keinen Typ dar.
    Warum sollte ein Interface kein Typ sein? DirectCast fordert, dass einer der beiden Typen von dem anderen erbt oder den Typ implementiert.
    Zitat Zitat von luigied Beitrag anzeigen
    Ja, ursprünglich war ich auch dieser Meinung. Habe für diesen speziellen fall zwar jetzt ein notdürftiges workaround gefunden, aber an einer anderen Stelle taucht das Gleiche Problem wieder auf.

    Code :
    1
    
    Dim conn As IConnector = ConnectorMap(Id)

    In der ConnectorMap steckt bis dahin ein Objekt von MSSQLConnector.Connectors.MSSQLConnector. Doch an dieser Stelle bekomme ich folgende Exception:
    Du meinst Compiler-Fehler, oder?!
    Zitat Zitat von luigied Beitrag anzeigen
    Mein MSSQLConnector implementiert allerdings IConnector und sollte deshalb auch in diesen umgewandelt werden können.
    Kann es sein, dass du gehörig mit Namensräumen durcheinander kommst? Und das IConnector in dem Kontext etwas anderes ist als BasicConnector.IConnector?

    \edit: Insbesondere (da ich gerade nochmal deine Bemerkung über Reflection gelesen habe) kann es sein, das du das Interface-Assembly neu erstellt hast, aber nicht beide abhängigen Bibliotheken ebenfalls? So dass die Type-ID vom Interface welches MSSQLConnector implementiert ungleich und somit inkompatibel zur Type-ID des Interface in deiner Anwendung ist?

    Gruß
    Geändert von deepthroat (28.06.11 um 15:52 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    luigied luigied ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    77
    Hi deepthroat,

    danke für deine Antwort.

    Ich hatte extra alle Bibliotheken neu kompiliert. (also die abhängigen als letztes ) Trotzdem hatte ich weiter diese Runtime-Exception (InvalidCastException) Der Compiler findet den Cast ganz vernünftig und hat mir seinen Segen gegeben, aber irgendwie hat die CLR eben immer das letzte Wort.

    Ich habe jetzt einen kleinen Umweg über Reflections genommen und siehe da: es funktioniert.

    Code :
    1
    2
    3
    4
    5
    
    Dim t As Type = ConnectorMap(Id).GetType
                Dim conn As Object = Activator.CreateInstance(t)
                conn = ConnectorMap(Id)
                Dim m As System.Reflection.MethodInfo = t.GetMethod("method")
                Dim struct As String = m.Invoke(conn, Nothing)

    Jetzt würde mich interessieren, in wie weit dieser Weg performance-technisch schlechter ist, als der Cast über das Interface.

    mfg LuigiEd
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von luigied Beitrag anzeigen
    Ich hatte extra alle Bibliotheken neu kompiliert. (also die abhängigen als letztes ) Trotzdem hatte ich weiter diese Runtime-Exception (InvalidCastException)
    Und hast du auch die Referenzen neu gesetzt? Also Assembly-Referenz entfernt, dann neu eingefügt? Und auch in jedem Projekt Debug bzw. Release Builds verwendet?
    Zitat Zitat von luigied Beitrag anzeigen
    Ich habe jetzt einen kleinen Umweg über Reflections genommen und siehe da: es funktioniert.

    Code :
    1
    2
    3
    4
    5
    
    Dim t As Type = ConnectorMap(Id).GetType
                Dim conn As Object = Activator.CreateInstance(t)
                conn = ConnectorMap(Id)
                Dim m As System.Reflection.MethodInfo = t.GetMethod("method")
                Dim struct As String = m.Invoke(conn, Nothing)

    Jetzt würde mich interessieren, in wie weit dieser Weg performance-technisch schlechter ist, als der Cast über das Interface.
    Vermutlich wird es "performance-technisch" nicht gerade das gelbe vom Ei sein, vor allem ist es aber häßlich

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    Avatar von Muepe32
    Muepe32 Muepe32 ist offline Mitglied Brokat
    Registriert seit
    Mar 2011
    Beiträge
    354
    Hast du mal die Informationen aus t angeschaut und dann die implementierten Interfaces verglichen mit GetType(IConnector)? Möglicherweise findest du dann Infos was anders ist (Versionsnummer, public key, ...).
     
    Viele Tutorials und Artikel zur Programmierung unter Windows mit C++ und C#. Tägliche Updates und Antworten auf eure Fragen:
    Win32Easy - Blog
    Es würde mich freuen, wenn ihr einen Kommentar postet!

  10. #10
    luigied luigied ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    77
    @deepthroat: Hatte ich, dachte ich gemacht. Werd das nochmal überprüfen.
    @Muepe32: Das werd ich mir mal ansehen. Klingt gut

    Kann es eventuell daran liegen, dass ich hier noch mit .NET 2.0 arbeite? Ist ja auch nicht mehr das Neueste
     

  11. #11
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von luigied Beitrag anzeigen
    Kann es eventuell daran liegen, dass ich hier noch mit .NET 2.0 arbeite? Ist ja auch nicht mehr das Neueste
    Wenn ich mich recht erinnere hat sich an der CLR nichts geändert zwischen .NET 2.0 und 4.0.

    Du könntest ja mal mit dem IL Disasm die Assemblies laden und bei .class bzw. .class interface schauen wie der IL Code aussieht. Die Zahlen in den Kommentaren sollten entsprechend übereinstimmen.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 03.06.10, 22:09
  2. IDirect3DDevice9 cast Probleme
    Von MedRamBO im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 23.02.09, 22:59
  3. Probleme mit dynamischem cast
    Von Snowcrack im Forum .NET Café
    Antworten: 1
    Letzter Beitrag: 27.01.08, 21:44
  4. [AspectJ] Interface Probleme ...
    Von TommyMo im Forum Java
    Antworten: 4
    Letzter Beitrag: 06.01.06, 17:28
  5. cast
    Von masterjcl im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 25.11.04, 20:20