v skratke: mam DLL kniznicu naprogramovanu v C++, a potrebujem v C# pouzit jednu funkciu z nej. Docital som sa na nete, ze potrebujem Data Marshaling, coz sa zda pomerne jednoduche, avsak nikde neprebrali specialne pripady (ako je ten moj), ked potrebujem naplnit datami struct.
Hlavicka danej funkcie v C++ je takato:
Kód: Vybrať všetko
int cert_get_info(const unsigned char *pcert, unsigned int lcert, T_CERT_INFO *info);Kód: Vybrať všetko
typedef struct
{
unsigned int lcert;
char *subject;
unsigned int l_subject;
char *issuer;
unsigned int l_issuer;
char *mod;
unsigned int l_mod;
char *exp;
unsigned int l_exp;
char *pkinfo;
unsigned int l_pkinfo;
char *serial;
unsigned int l_serial;
char *validfrom;
unsigned int l_validfrom;
char *validto;
unsigned int l_validto;
} T_CERT_INFO;1. surove data
2. dlzku tychto dat
3. objekt CERTINFO, kam by sa mali naplnit jednotlive polia zo struct-u. Prave tu som si nie isty, ako spravne takyto struct (resp. pointer na struct) marshal-ovat.
Kód: Vybrať všetko
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace PKCS11Lib
{
public static class Asn1Parser
{
public static byte[] certData;
public static CERTINFO certInfo;
[DllImport("asn1.dll", EntryPoint = "cert_get_info")]
private static extern void Cert_get_info([In] byte[] in_certdata, [In] uint in_datalen, [MarshalAs(UnmanagedType.LPStruct)] [In][Out] ref CERTINFO out_pinfo);
public static void LoadInfo(string rawData)
{
certInfo = new CERTINFO();
certData = Encoding.ASCII.GetBytes(rawData);
Cert_get_info(certData, Convert.ToUInt32(certData.Length), ref certInfo); //////////////////////////// tuna to pada
}
}
[StructLayout(LayoutKind.Sequential)]
public class CERTINFO
{
public uint lcert;
[MarshalAs(UnmanagedType.LPStr)]
public string subject;
public uint l_subject;
[MarshalAs(UnmanagedType.LPStr)]
public string issuer;
public uint l_issuer;
[MarshalAs(UnmanagedType.LPStr)]
public string mod;
public uint l_mod;
[MarshalAs(UnmanagedType.LPStr)]
public string exp;
public uint l_exp;
[MarshalAs(UnmanagedType.LPStr)]
public string pkinfo;
public uint l_pkinfo;
[MarshalAs(UnmanagedType.LPStr)]
public string serial;
public uint l_serial;
[MarshalAs(UnmanagedType.LPStr)]
public string validfrom;
public uint l_validfrom;
[MarshalAs(UnmanagedType.LPStr)]
public string validto;
public uint l_validto;
}
}Kód: Vybrať všetko
Asn1Parser.LoadInfo(Encoding.ASCII.GetString(cert.GetRawCertData(), 0, cert.GetRawCertData().Length));Moja otazka je, ako korektne marshalovat data do a z tejto funkcie v DLL kniznici? Najma co sa tyka toho struct-u. Skusal som tam namiesto ref-u aj out, potom aj rozne menit atributy volania [In] a [Out] a nic nezabralo. Stale mi to pada na oznacenom riadku s exception NotSupportedException, ktora ziadne blizsie info ani popis neponuka.
Topiaci sa aj stebla chyta, takze... vie niekto pomoct, pls?