Les membres d'une interface ont le même niveau d'expositon que l'interface, qui est soit public, soit internal (dans ton cas c'est public).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public interface MyInterface { string GetId(); // GetID est publique ! }
Ok, merci, c'est corrigé.
Donc,je dois l'écrire, pour mon cas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part MyInterface myInstance = (MyInterface) myAssembly.CreateInstance("MonType");?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DllInterface dllInterface;//DllInterface, c'est la classe interface de mon assembly, donc. (DllInterface)assembly.CreateInstance("AVL_VT_SERIAL.Base");
:Bien entendu, tu as modifié AVL_VT_SERIAL pour implémenter cette interface ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part DllInterface dllInterface = (DllInterface)assembly.CreateInstance("AVL_VT_SERIAL.Base");
Sinon, pourquoi "base" ?
"Base", c'est la classe de ma dll AVL_VT_SERIAL.dll qui contient les méthodes de... base, dont "GetId()" (et sa surcharge). pour comprendre le contexte, cette dll est plus ou moins un driver de communication avec une balise GPS. Ensuite, elle contiendra aussi des classes correspondantes aux versions de firmware de ces balises.
Pour ce qui est de l'implémentation dans la dll, je l'ai bien référencée, mis en "using", mais au delà, je vois pas quoi mettre d'autre.
Là je pense qu'il faut commencer par lire un tutoriel sur la programmation de base en C# car sinon on va pas s'en sortir.
Visiblement tu n'as pas implémenté l'interface dans la classe (dont le nom est accessoirement très très mal choisi, car "base" typiquement est le suffixe de nom de classe de base c'est à dire destinées à être héritées mais c'est un détail).
Donc ça ne marchera pas.
La classe DOIT IMPLEMENTER L'INTERFACE sinon tu ne pourras pas la caster vers cette interface.
Ta déclaration d'en tête de classe doit donc être
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public MyClass : MyInterface { // .... le code }
arg... ok, c'est fait.
Voici le code principal corrigé :il y a une erreur au niveau de SendCommand(dllInterface.GetId()); dans la méthode update. dllInterface a une value null.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214 using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.IO.Ports; using System.IO; using System.Text; using System.Linq; using System.Xml.Linq; using System.Reflection; using System.Management; using Microsoft.Win32; using System.Globalization; using DLLInterface; namespace TrakerCfgSoft { /// <summary> /// Description of MainForm. /// </summary> public partial class GPSForm : Form { //List<string> listofport=new List<string>(); //List<string> listofdevice=new List<string>(); SerialPort mySerialPort; XElement trackerlist=new XElement(new XElement ("trackers")); Assembly assembly; Type type; MethodInfo method; DllInterface dllInterface; public GPSForm() { InitializeComponent(); } private void MainFormLoad(object sender, EventArgs e) { mySerialPort = new SerialPort(); } private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { // Event for receiving data // Read the buffer to text box. this.Invoke(new EventHandler(DoUpdate)); } private void DoUpdate(object s, EventArgs e) { //Then, the textbox always display new messages when they arrive. //txResponse.Text = txResponse.Text + mySerialPort.ReadExisting(); txResponse.AppendText(mySerialPort.ReadExisting()); } public void CreatePort(string port) { //paramètres de connexion mySerialPort.PortName = txPort.Text.ToUpper(); mySerialPort.BaudRate = 57600; mySerialPort.Parity = Parity.None; mySerialPort.StopBits = StopBits.One; mySerialPort.DataBits = 8; mySerialPort.Handshake = Handshake.None; mySerialPort.DtrEnable = true; mySerialPort.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);//to get messages from the port. } public void SendCommand(string cmd) { // Button to send test data try { string commandeaffiche = "===> " + txSend.Text + "\n"; txResponse.SelectionColor = Color.Firebrick; txResponse.AppendText(commandeaffiche); txResponse.SelectionColor = Color.Black; string data = txSend.Text + (char)13; //where 13 is the <CR> ASCII code. byte[] commande = Encoding.ASCII.GetBytes(data); mySerialPort.Write(commande, 0, commande.Length); //txResponse.Text = txResponse.Text + txSend.Text; } catch (Exception sendex) { MessageBox.Show(sendex.ToString()); } } private void btSend_Click(object sender, EventArgs e) { SendCommand(txSend.Text); } void BtOpenClick(object sender, EventArgs e) { if (mySerialPort.IsOpen == false) { CreatePort(txPort.Text); mySerialPort.Open(); StatusLabel.Text = "Port Ouvert."; } } void BtCloseClick(object sender, EventArgs e) { //To close the connection mySerialPort.Close(); StatusLabel.Text = "Port Fermé."; } private void portList_SelectedIndexChanged(object sender, EventArgs e) { //Send the selected item port(DeviceID from listofport) in the txPort textbox // //txPort.Text = (listofport[(portList.SelectedIndex)]).ToString(); string port = (from element in trackerlist.Elements("port") where element.Attribute("ident").Value == (string)portList.SelectedItem select element.Attribute("port").Value).First().ToString(); txPort.Text=port; } private void portList_Update(object sender, EventArgs e) { //empty the two lists //listofdevice.Clear(); //listofport.Clear(); //will scan the serialports to get DeviceID (ports COMx) and Name of the connected device try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_SerialPort"); foreach (ManagementObject queryObj in searcher.Get()) { //listofport.Add(Convert.ToString(queryObj["DeviceID"])); //listofdevice.Add(Convert.ToString(queryObj["Name"])); string port = Convert.ToString(queryObj["DeviceID"]); string model = Convert.ToString(queryObj["Name"]); txPort.Text=port; CreatePort(port); mySerialPort.Open(); GetDriver(model); SendCommand(dllInterface.GetId()); string ident = dllInterface.GetId(mySerialPort.ReadExisting()); mySerialPort.Close(); //btSend_Click try { trackerlist.Add( (new XElement("tracker", new XAttribute("model", model), new XAttribute("port", Convert.ToString(queryObj["DeviceID"])), new XAttribute("ident", ident)))); } catch { trackerlist.Add( (new XElement("tracker", new XAttribute("model", model), new XAttribute("port", Convert.ToString(queryObj["DeviceID"])), new XAttribute("ident", "Connexion non identifiable")))); } } } catch (ManagementException me) { MessageBox.Show("An error occurred while querying for WMI data: " + me.Message); } //refill the porList with the ports scan result portList.Items.Clear(); //portList.Items.AddRange((string[])listofdevice.ToArray()); var tracklist = (from element in trackerlist.Elements("ident") select trackerlist.Attribute("ident").Value).ToList(); tracklist.ToList().ForEach(v => portList.Items.Add(v)); } private void txSend_KeyPress(object sender, KeyPressEventArgs e) { //initiate btSend_Click event when press the Return or Enter keys if (e.KeyChar == (char)Keys.Return || e.KeyChar == (char)Keys.Enter) btSend_Click(sender,e); } private void txResponse_TextChanged(object sender, EventArgs e) { //to scroll the text to last line txResponse.SelectionStart = txResponse.Text.Length; txResponse.ScrollToCaret(); txResponse.Refresh(); } public void GetDriver(string model) { if (model.Contains("AVL VT-SERIAL")) { dllInterface=(DllInterface)assembly.CreateInstance("AVL_VT_SERIAL.Base"); //assembly = Assembly.LoadFrom("AVL_VT_SERIAL.dll"); //else if (model.Contains("Port de communication")) // assembly = Assembly.LoadFrom("X8.dll"); //type = assembly.GetType("AVL_VT_SERIAL.Base"); method = type.GetMethod("GetId", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public); } } //public string GetId() //{ // return; //} } }
EDIT : je reposte la classe basis corigée d'une dll, pour rappel
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 using System; using System.Collections.Generic; using System.Linq; using System.Text; using DLLInterface; namespace AVL_VT_SERIAL { public class Basis:DllInterface { public string GetId() { return "$wp+uncfg=0000,?"; } public string GetId(string message) { char[] separator=new char[]{' ',',','=','+',':'}; string[] decoupe = message.Split(separator); return decoupe[3]; } } }
Ton code étant difficilement lisible (mélange d'accès aux données, d'ihm et de code métier dans la même classe !!!) , que retourne la ligne :
Si cette ligne ne fonctionne pas, pas besoin d'aller plus loin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part dllInterface=(DllInterface)assembly.CreateInstance("AVL_VT_SERIAL.Base"
tu préfixe le type par le nom d'assembly ? utilises-tu un namespace ayant le même nom que l'assembly pour la classe Base ?
namespace de même nom, oui. ça vient de ça ?
correction de "Base" en Basis" (bien sûr)
Non, simplement c'est curieux; le namespace correspond à une logique de regroupement, le nom de l'assembly est un nom physique de fichier; en général on ne mélange pas les deux.
Donc, retour à la question initiale : l'instanciation de "Basis" fonctionne-t-elle ? (dans le cas contraire, elle lève un exception il me semble).correction de "Base" en Basis" (bien sûr)
NullException non gérée, mais je l'ai au niveau de l'instructionqui pointe le GetId()
Code : Sélectionner tout - Visualiser dans une fenêtre à part SendCommand(dllInterface.GetId());
Bon, je pense que tu décourages les meileures volontés.
Quand tu seras décidé à répondre aux questions, n'hésite pas à revenir.
La question était pourtant claire et précise.
Je réitére une dernière fois :
Quand tu exécutes la ligne :
QUE SE PASSE-T-IL ????
Code : Sélectionner tout - Visualiser dans une fenêtre à part dllInterface=(DllInterface)assembly.CreateInstance("AVL_VT_SERIAL.Base");
R.I.E.N ! sur CETTE ligne là.
l'exception intervient là où je l'ai dit.
Mais maintenant, ça n'y passe même plus. et ma liste reste vide.
Bon avant de pouvoir répondre, il faut que je puisse contourner mon instruction qui gêne quand je boucle sur les port qui ne vont pas.
je reviens...
Ca signifie que la description de ton type dans l'appel à CreateInstance est invalide. (ou alors que tu ne passes pas desus).
Pas la peine de chercher plus loin.
Tu as mis un breakpoint pour t'en assurer ?
Ce qui est anormal cest que tu ne fasse pas de test au retour de l'appel de méthode CreateInstance et que tu poursuives l'exécution dans ce cas.
Tu n'as pas un problème de case sensitivity ? (a priori non, si j'en juge par le code de la classe).
Voilà, j'y arrive.
Donc, l'exception générée est :Et excusez moi. Le code commence à être un vrai cirque et il me reste deux semaine pour faire l'appli finale (celle là n'est qu'un test de fonctionnalités).L'exception NullReferenceException n'a pas été gérée - La référence d'objet n'est pas définie à une instance d'un objet.
assembly null System.Reflection.Assembly
dllInterface null DLLInterface.DllInterface
model "AVL VT-SERIAL (COM4)" string
this {TrakerCfgSoft.GPSForm, Text: Traceur GPS : 0} TrakerCfgSoft.GPSForm
je viens d'ajouter les info de l'espion, au niveau de l'erreur. assembly et dllInterface à null, ça me plait pas. Je me trompe ?
Les autre fonctionnalités marchent bien. elles ont déjà été utilisées.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager