Hallo wie kann ich diesen Funktionheader in C# deklarieren ?
void AuthEncode( unsigned __int8 *string, unsigned int len,
unsigned __int8 *key, unsigned int klen, unsigned __int8 digest[16] )
gruss
Soll die Funktion in einer .Net-Dll bereitgestellt/veröffentlicht werden oder gibt es sie schon und du möchtest sie in deinem .Net-Programm verwenden?
Ersteres geht nicht, da zum Ausführen von .Net-Code die .Net-Runtime laufen müsste. Das ist nicht gegeben, wenn von C/C++ aus eine Funktion in einer Dll aufgerufen wird. Man kann .Net-Dlls nur als CCW (Com Callable Wrapper) von ungemanagten Code aufrufen lassen, also COM-Programmierung.
Um eine bestehende C/C++ Funktion in .Net zu verwenden, versuche mal folgendes (wird zwar nicht auf Anhieb funktionieren, aber die Fehlermeldung hilft dir vielleicht weiter):
[DllImport("encodeLib.dll")]
private static extern void AuthEncode(
string text,
int textLen,
string key,
int keyLen,
out byte[] digest);
Msdn:
Zusammenarbeit mit nicht verwaltetem Code
Lernprogramm P/Invoke
Gruss
Pulpapex
Ich glaube, den letzten Parameter muss man als String mit
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=16 )]
definieren.... bin mir aber nicht sicher.
Die ganze Funktion sieht so aus:
void AuthEncode( unsigned __int8 *string, unsigned int len,
unsigned __int8 *key, unsigned int klen, unsigned __int8 digest[16] )
{
MD5_CTX context;
unsigned __int8 buf[256];
memcpy(buf, key, klen);
memcpy(buf+klen, string, len);
memcpy(buf+klen+len, key, klen);
MD5Init (&context);
MD5Update (&context, buf, len+2*klen);
MD5Final (digest, &context);
}
Ich sollte diese in dll einpacken.
Ich denke string und key sind bytes und keine string oder ?
So ungefähr ?!
[DllImport("MD5", SetLastError=true)]
private static extern void AuthEncode(
byte[] data,
uint datalength,
byte[] key,
uint keylength,
byte[] digest
);
Müsste der letzte Parameter nicht noch mit einem MarshalAs versehen werden
[MarshalAs(UnmanagedType.LPArray, SizeConst=16)]
byte[] digest
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Ich hab nachgeschaut wie ich mal Arrays gemarshalt hatte. Es hatte ausgereicht [In, Out] anzugeben. Das Array als out-Parameter anzugeben, ging glaube ich nicht. Wahrscheinlich rät hier der Marshaller in welchen C-Typ genau umgewandelt wird, also ist MarshalAs schon ok. text und key würde ich im ersten Anlauf versuchen als string-Parameter zu übergeben, eigentlich sollen es ja Strings sein. Falls es nicht klappt, kann man es erst auch mit MarshalAs versuchen, bevor man einen anderen Typ probiert.
[DllImport("encodeLib.dll")]
private static extern void AuthEncode(
string text,
int textLen,
string key,
int keyLen,
[Out] byte[] digest);