Entwickler-Ecke
Basistechnologien - Unterschiedliche DLLs - Gleiche Namespaces
Raven280438 - Di 06.12.11 14:00
Titel: Unterschiedliche DLLs - Gleiche Namespaces
Hi,
ich habe 2 DLLs die ich als Verweis in das Projekt eingefügt habe.
Beide DLLs haben die gleichen Namespaces (in unterschiedlichen Versionen).
Kann ich irgendwie auf einen Namespace einer bestimmten DLL zugreifen?
Hintergrund:
Ich arbeite mit dem MySQL-Connector. Die neuste Version unterschützt aber nichtmehr Mysql 4.0. Ich wollte versuchen, den Connector in verschiedenen Versionen zu benutzen, je nach Mysql-Version des Servers.
Hat jemand ne Idee?
Gruß
Ralf Jansen - Di 06.12.11 14:30
Erst rausfinden welche der beiden Assemblies du brauchst und dann die passende dynamisch laden?
Raven280438 - Di 06.12.11 15:46
Hi,
danke für die Info.
Ich hab beim Recherchieren
diese Seite [
http://www.christopher-lenz.de/net-c-tutorials/reflection-mit-net--c/74-reflection-assembly-dynamisch-laden-und-nutzen] gefunden.
Dabei wird eine Klasse aus einer DLL geladen. Allerdings hat die Klasse die ich benötige im Konstruktor noch eine Variable. Wie kann ich den Code anpassen, dass ich dem Konstruktor noch eine Variable übergeben kann?
Wie kann ich danach in der Methode "Open" die
Open-Methode von der
MySQLConnection-Klasse aufrufen (woher weis die Klasse, dass sie eine Methode hat)?
Hier mein Aktueller Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| class MySQL50 { private String DLLName = "MySql.Data.dll"; private Assembly A = null;
private object MySQLConnection = null;
public MySQL50(String ConnString) { this.A = Assembly.LoadFile(this.DLLName);
Type t = A.GetType("MySql.Data.MySqlClient.MySqlConnection");
this.MySQLConnection = Activator.CreateInstance(t); }
public bool Open() { try { this.MySQLConnection.Open(); } catch (Exception ex) { MessageBox.Show(ex.Message); return false; }
return true; } } |
Gruß
Raven280438 - Di 06.12.11 15:54
Hi,
Ok danke,
Wie verhält es sich mit de Open-Methode? Muss ich dafür ein Interface machen?
Gruß
Ralf Jansen - Di 06.12.11 15:57
| Zitat: |
| private object MySQLConnection = null; |
aus object solltest du DbConnection machen. Vereinfacht die Handhabung. Gilt genauso für die anderen Object wie DbCommand, DbDataReader, DbTransaction und was man sonst so braucht. Wenn deine DatenbankWrapper Klasse diese Typen veröffentlicht solltest du die genauso verwenden können als würdest du eine konkrete Implementierung verwenden.
Raven280438 - Di 06.12.11 16:00
Hi,
ich hoffe ich hab das richtig verstanden ;)
Woher kenne ich aber die Klasse "MySqlConnection"? Muss ich dazu eine der DLLs dem Projekt als Verweis hinzufügen? Oder wo bekomm ich die Klasse her?
Gruß
Ralf Jansen - Di 06.12.11 16:04
MySqlConnection musst du nicht kennen (sind ja auch in deinem Fall 2 verschiedene Klassen) sondern nur DBConnection. Gegen DBConnection(die Basisklasse für alle Connection Klassen) solltest du genauso arbeiten können wie gegen MySqlConnection.
Raven280438 - Mi 07.12.11 11:01
Hi,
danke für die Hilfe, ich habs hinbekommen.
Hier die komplette Klasse, falls irgendjemand das gleiche Problem hat:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74:
| class MySQL5 { private String DLLName = "MySql.Data.dll"; private Assembly A = null;
private DbConnection MySQLConnection = null; private DbDataAdapter DataAdapter = null; private DbCommand Command = null;
public MySQL5(String ConnString) { this.A = Assembly.LoadFile(Path.Combine(Application.StartupPath,this.DLLName));
Type t = A.GetType("MySql.Data.MySqlClient.MySqlConnection"); Type ta = A.GetType("MySql.Data.MySqlClient.MySqlDataAdapter"); Type tc = A.GetType("MySql.Data.MySqlClient.MySqlCommand");
this.MySQLConnection = (DbConnection)Activator.CreateInstance(t,new object[] { ConnString });
this.DataAdapter = (DbDataAdapter)Activator.CreateInstance(ta, null);
this.Command = (DbCommand)Activator.CreateInstance(tc, null); }
public bool Open() { try { this.MySQLConnection.Open(); } catch { return false; }
return true; }
public DataSet SendQuery(String query) { this.Command.CommandText = query; this.Command.Connection = this.MySQLConnection;
this.DataAdapter.SelectCommand = this.Command;
DataSet ds = new DataSet();
this.DataAdapter.Fill(ds);
return ds; }
public void Close() { this.MySQLConnection.Close(); } } |
Gruß
Ralf Jansen - Mi 07.12.11 11:19
Dataset als Rückgabetyp von SendQuery ist etwas übertrieben. Die würde eh nur eine DataTable enthalten da reicht es dann auch gleich bei DataTable zu bleiben.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!