Ik wil in c# een aantal functies uit een dll van derde gebruiken en heb dus geen idee wat de functies onderwater allemaal doen. Zoals het topic al zegt krijg ik een accessviolation exception. Door google ben ik er achter gekomen dat dit meestal optreed door verkeerde pointer waarden maar de functie die ik aanroep krijgt van mij geen pointers mee...
Nu is het wel zo dat de dll ook een aantal log/error/warning functies heeft die gebruik maken van een function pointer zodat jezelf de log/error/warning kan verwerken. Aangezien ik niet weet wat de connect functie precies doet denk ik dat dit met de violation te maken kan hebben.
De functies in de dll om deze callbacks te zetten zien er allemaal hetzelfde uit en zijn zo geimplementeerd
Ik dacht dat het probleem hem misschien nog kon zitten in het feit dat de delgates verplaats worden in het memory door de gc dus deze heb ik met een alloc geprobeerd vast te zetten.
gcLog wordt weer vrij gegeven bij het sluiten van het programma.
De enable log functie wordt zo aangeroepen
Ook dit lost het probleem niet op. Ziet iemand een fout in mijn redenatie of heeft iemand een idee waar het anders nog aan kan liggen?
C#:
1
2
3
4
5
6
7
8
| [DllImport(@"\lib\onzin.dll", CallingConvention=CallingConvention.Cdecl)] private static extern int onzin_Connect(); public static string connect() { int result = onzin_Connect(); if (result == 0) { return result.ToString() + " O.K. Target identified successsfully"; } else { return "Error: " + result.ToString(); } } |
Nu is het wel zo dat de dll ook een aantal log/error/warning functies heeft die gebruik maken van een function pointer zodat jezelf de log/error/warning kan verwerken. Aangezien ik niet weet wat de connect functie precies doet denk ik dat dit met de violation te maken kan hebben.
De functies in de dll om deze callbacks te zetten zien er allemaal hetzelfde uit en zijn zo geimplementeerd
C#:
1
2
3
4
5
6
7
8
| public delegate void log_callback(StringBuilder s); [DllImport(@"\lib\onzin.dll", CallingConvention=CallingConvention.Cdecl)] private static extern void onzin_EnableLog(ref log_callback pfLog); public static string enableLog(log_callback pfLog) { onzin_EnableLog(ref pfLog); return "Function executed"; } |
Ik dacht dat het probleem hem misschien nog kon zitten in het feit dat de delgates verplaats worden in het memory door de gc dus deze heb ik met een alloc geprobeerd vast te zetten.
C#:
1
2
3
4
5
6
7
8
| onzinWrapper.log_callback logCb; GCHandle gcLog; public AppMainForm() { InitializeComponent(); gcLog = GCHandle.Alloc(logCb); } |
gcLog wordt weer vrij gegeven bij het sluiten van het programma.
De enable log functie wordt zo aangeroepen
C#:
1
2
3
4
5
6
7
| public void log(StringBuilder s) { txtOutput.Text += "Log: " + s.ToString(); } logCb = new onzinWrapper.log_callback(log); onzinWrapper.enableLog(logCb); |
Ook dit lost het probleem niet op. Ziet iemand een fout in mijn redenatie of heeft iemand een idee waar het anders nog aan kan liggen?