Hallo,
Ich habe eine Dll importiert bzw eine Methode der Dll, hier der Code:
SECItem *
NSSBase64_DecodeBuffer (PRArenaPool *arenaOpt, SECItem *outItemOpt,
const char *inStr, unsigned int inLen)
{
return NSSBase64_DecodeBuffer_Util(arenaOpt, outItemOpt, inStr, inLen);
}
Zum verständnis noch SECItem:
struct SECItem {
SECItemType type;
unsigned char *data;
unsigned int len;
};
Und noch SECItemType:
enum SECItemType {
siBuffer = 0,
siClearDataBuffer = 1,
siCipherDataBuffer = 2,
siDERCertBuffer = 3,
siEncodedCertBuffer = 4,
siDERNameBuffer = 5,
siEncodedNameBuffer = 6,
siAsciiNameString = 7,
siAsciiString = 8,
siDEROID = 9,
siUnsignedInteger = 10,
siUTCTime = 11,
siGeneralizedTime = 12
};
Und ein Aufruf der NSSBase64_DecodeBuffer-Funktion:
SECItem newResult = {0, 0, 0};
SECItem *ok = NSSBase64_DecodeBuffer(NULL, &newResult,
(const char *)result.data, result.len);
Ich habe schon alles möglihc eprobiert, aber nie hat es funktioniert.
Hier habe ich z.B. die Struktut SECItem nachgebaut:
public struct SECItem
{
public Int32 type;
public char[] data;
public Int32 length;
}
Und hier die Methodendeklaration:
[DllImport(@"nss3.dll", CharSet = CharSet.Ansi)]
public static extern int NSSBase64_DecodeBuffer(object val, ref SECItem output, StringBuilder input, UInt32 inputLength);[/csharp
Wobei diese habe ich schon tausendmal geändert, halt aus Not mal alles ausprobiert.
Aktuell sieht der Aufruf so aus:
[csharp] SECItem output1 = new SECItem();
output1.data = new char[1000];
output1.length = 1000;
...
NSSBase64_DecodeBuffer(null, ref output1, code, (UInt32)code.Length);
Das Ergebnis ist eine SafeArrayTypeMistmatchException, mit der folgenden Message:
"Das angegebene Array hat nicht den erwarteten Typ."
Kann mir hier bitte jemand helfen?
mfG benj
Hallo,
habe das hier nur flüchtig überflogen, aber eins ist mir trotzdem gleich aufgefallen:
unsigned char in C ist nicht das gleiche wie der char Typ in C# (Unicode)
Ausserdem muss der Puffer unmanaged reserviert werden.
also etwa so:
IntPtr iPtr = Marshal.AllocHGlobal(1000);
.. und hinterher wieder freigeben werden
Marshal.FreeHGlobal(iPtr);
in einen C# string kannst Du das z.B. mit
Marshal.PtrToStringAnsi()
wieder umwandeln.
Schau dir mal den Marshal Namespace genauer an, gibt auch sonst ne Menge Beispiele im Netz.