#ifndef ZZC_SETCA_H
#define ZZC_SETCA_Htypedef struct
{
char *SerialNum;
char *IssuerCountryName;
char *IssuerOrgnizationName;
char *IssuerCommonName;
char *CountryName;
char *OrgnizationName;
char *DepartmentName;
char *CommonName;
char *Sur;
char *GivenName;
char *Rights;
char *GroupName;
char *Title;
unsigned char PubKey[128];
char *IdentityName;
char *EMail;
char *IP;
char *DNS;
long NotBefore;
long NotAfter;
long CertUsage;
}CertDBItem;extern "C" int WINAPI GetCertDBItemFromCert(int certlen,unsigned char *pcert,CertDBItem *pcertdbitem);#endif以下是小弟我在C#中定义的接口,为什么执行结果总是为空,请各位指点        public struct CertDBItem
        {
            public string SerialNum;
            public string IssuerCountryName;
            public string IssuerOrgnizationName;
            public string IssuerCommonName;
            public string CountryName;
            public string OrgnizationName;
            public string DepartmentName;
            public string CommonName;
            public string Sur;
            public string GivenName;
            public string Rights;
            public string GroupName;
            public string Title;
            public string PubKey;
            public string IdentityName;
            public string EMail;
            public string IP;
            public string DNS;
            public int NotBefore;
            public int NotAfter;
            public int CertUsage;
        }        [DllImport("SetCA.dll")]
        public static extern int GetCertDBItemFromCert(int certlen,byte[] pcert,CertDBItem[] pcertdbitem);
以下是我的调用方式
            wjjmk.CertDBItem[] objcertdbitem = new wjjmk.CertDBItem[1];
            int i = wjjmk.GetCertDBItemFromCert(intcertlen, bytdatacert, objcertdbitem);
intcertlen和bytdatacert参数是没有问题的,关键是最后参数是不是有问题,请指点

解决方案 »

  1.   

    Have a try
    char *: StringBuilder
    or
    char*: byte[]
      

  2.   

    public static extern int GetCertDBItemFromCert(int certlen,byte[] pcert,
    [Out,MarshalAs(UnmanagedType.LPArray)]CertDBItem[] pcertdbitem);
      

  3.   

    加上这句了吗?using System.Runtime.InteropServices;
      

  4.   

    to 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。CertDBItem在dll函数中如何被操作的。