Laden...

funktion von dll deklarieren

Erstellt von knopper vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.479 Views
K
knopper Themenstarter:in
40 Beiträge seit 2005
vor 18 Jahren
funktion von dll deklarieren

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

P
939 Beiträge seit 2003
vor 18 Jahren

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

S
8.746 Beiträge seit 2005
vor 18 Jahren

Ich glaube, den letzten Parameter muss man als String mit

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=16 )]

definieren.... bin mir aber nicht sicher.

K
knopper Themenstarter:in
40 Beiträge seit 2005
vor 18 Jahren

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  
		);
4.221 Beiträge seit 2005
vor 18 Jahren

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...

P
939 Beiträge seit 2003
vor 18 Jahren

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);