Lang geleden, maar ik ga hier toch nog eens een topic openen, ik zit nl. reeds een tijd te 'sjieken' op een probleem dat ik maar niet opgelost krijg.
We hebben hier een C++ DLL waar er een aantal methods gedefinieerd zijn die we via P/Invoke aanroepen vanuit .NET.
Deze C++ dll bestaat al enkele jaren, en werkte tot nu toe naar tevredenheid. Eén van de methods die we vanuit C# aanroepen, ziet er als volgt uit in die C++ dll.
Deze method roepen we aan vanuit een C# dll. Hiertoe gebruiken we het DllImport attribute:
Dit werkt perfect; we kunnen vanuit C# de BtrTableOpenEx method zonder probleem aanroepen.
Onlangs heb ik er echter een method moeten aan toevoegen aan die C++ dll. Het is eigenlijk dezelfde method, maar met een extra parameter. Ik heb geen overload van die method gemaakt, maar een method met een andere naam gedefinieerd (gewoon dezelfde naam gepostfixt met 2):
Zoals je kan zien: de naam is gepostfixt met 2, er is een extra parameter toegevoegd van het type BTI_WORD. BTI_WORD is gedefinieerd als
De C++ dll compiled en build perfect.
Ik heb het .NET project aangepast zodanig dat deze nieuwe method ook vanuit .NET kan aangeroepen worden:
Als ik nu echter vanuit .NET deze BtrTableOpenEx2 method ga aanroepen, dan krijg ik een runtime-error "object reference not set to an instance".
Het lijkt erop alsof die nieuwe method niet gevonden wordt, want ik ben zeker dat de BtrTableOpenEx2 functie uit de C++ niet aangeroepen wordt.
Waarschijnlijk zie ik iets over het hoofd, maar ik weet niet wat. Hopelijk kan iemand mij helpen.
We hebben hier een C++ DLL waar er een aantal methods gedefinieerd zijn die we via P/Invoke aanroepen vanuit .NET.
Deze C++ dll bestaat al enkele jaren, en werkte tot nu toe naar tevredenheid. Eén van de methods die we vanuit C# aanroepen, ziet er als volgt uit in die C++ dll.
C++:
1
2
3
4
| extern "C" long WINAPI BtrTableOpenEx(long *Handle , char *TableName , char *DDLocation , char *DataLocation , char *Owner) { ... } |
Deze method roepen we aan vanuit een C# dll. Hiertoe gebruiken we het DllImport attribute:
code:
1
2
3
4
5
6
| [SuppressUnmanagedCodeSecurity] private static class NativeMethods { [DllImport ("BtrTable.dll")] internal static extern int BtrTableOpenEx( ref int handle, string tableName, string ddLocation, string dataLocation, string owner ); } |
Dit werkt perfect; we kunnen vanuit C# de BtrTableOpenEx method zonder probleem aanroepen.
Onlangs heb ik er echter een method moeten aan toevoegen aan die C++ dll. Het is eigenlijk dezelfde method, maar met een extra parameter. Ik heb geen overload van die method gemaakt, maar een method met een andere naam gedefinieerd (gewoon dezelfde naam gepostfixt met 2):
C++:
1
2
3
4
| extern "C" long WINAPI BtrTableOpenEx2(long *Handle , char *TableName , char *DDLocation , char *DataLocation, char *Owner, BTI_WORD threadId) { ... } |
Zoals je kan zien: de naam is gepostfixt met 2, er is een extra parameter toegevoegd van het type BTI_WORD. BTI_WORD is gedefinieerd als
C++:
1
| typedef unsigned short BTI_WORD; |
De C++ dll compiled en build perfect.
Ik heb het .NET project aangepast zodanig dat deze nieuwe method ook vanuit .NET kan aangeroepen worden:
C#:
1
2
3
4
5
6
7
8
9
10
11
| [SuppressUnmanagedCodeSecurity] private static class NativeMethods { #region Table manipulation [DllImport ("BtrTable.dll")] internal static extern int BtrTableOpenEx2( ref int handle, string tableName, string ddLocation, string dataLocation, string owner, ushort threadId ); [DllImport ("BtrTable.dll")] internal static extern int BtrTableOpenEx( ref int handle, string tableName, string ddLocation, string dataLocation, string owner ); } |
Als ik nu echter vanuit .NET deze BtrTableOpenEx2 method ga aanroepen, dan krijg ik een runtime-error "object reference not set to an instance".
Het lijkt erop alsof die nieuwe method niet gevonden wordt, want ik ben zeker dat de BtrTableOpenEx2 functie uit de C++ niet aangeroepen wordt.
Waarschijnlijk zie ik iets over het hoofd, maar ik weet niet wat. Hopelijk kan iemand mij helpen.
https://fgheysels.github.io/