当前位置: 代码迷 >> C# >> C# 引用C++动态库,怎么办返回的字符指针
  详细解决方案

C# 引用C++动态库,怎么办返回的字符指针

热度:92   发布时间:2016-05-05 03:22:47.0
C# 引用C++动态库,怎么处理返回的字符指针;
我用C++ 编写一个加密的动态库,加密后是一个16位的数组,我把转成了指针类型返回出去(自己是想着在C#那边好进行转化数据类型的,结果自己坑了),然后C#那边调用,但是不会处理这个指针类型,输出的结果不正确,要么是固定数字,要么是其他的固定字符;所以恳请各位来帮忙。
下面是加密的主函数:
#define EXPORT_DLL extern "C" __declspec(dllexport) 
EXPORT_DLL LPCWSTR Encrypt(int sourcein)
{
DES des;
int ret;
char in[16]="123456";
char out[16], outbase[64], outa[16];
int datalen = 16;
unsigned char key[] = {'0', '1', '2', '3', '4', '5', '6', '7'};//
int t=62;//进制
int cc=0;
char s1;
for(int i=0;i<9;i++){
cc=sourcein%t;
sourcein=(sourcein-cc)/t;
s1=_change62(cc);
in[i]=s1;
}
ret = des.CDesEnter((unsigned char *)in, (unsigned char *)out, datalen, key, 0);
fnBase64Encode(out, outbase, strlen(in));
LPCWSTR  result=outbase;
return result;

}


下面是C#下调用:
    [DllImport("CppDLL.dll", EntryPoint = "Encrypt", CallingConvention = CallingConvention.Cdecl)]
        extern static IntPtr Encrypt(int sourcein);

     
 
 
    
     

        private void ReadyToCreateQRCode_Click(object sender, EventArgs e)
        {

            int start = 5;
            int sourcenumber = 4;
            for (int sourcein = start; sourcein < start + sourcenumber; sourcein++)
            { 
                Console.WriteLine(getEncrypt(sourcein));
            }
            


       
     }
        unsafe  string getEncrypt (int sourcein){

            return System.Runtime.InteropServices.Marshal.PtrToStringUni(Encrypt(sourcein));
            //return Encrypt(sourcein);
        }


希望解决问题:让c++返回的outbase,能在C#上使用。
------解决思路----------------------
不可以在函数内返回局部变量的指针
应该由C#端传入输出的buffer

//c++
EXPORT_DLL void Encrypt(int sourcein, char outbase[64]);

//C#
[DllImport(...)]
static extern void Encrypt(int sourcein, byte[] outbase);
  相关解决方案