求助 c# 调用dll出现的问题.
本人在网上搜索到一用c++编写的des加密算法.我将其编译为dll后调用发现回传的密文和在c++环境下回传的密文不一样.不知道是不是编码不一样导致此问题.有没有哪位大侠遇到过类似问题?如何解决?
以下是编译为dll的源代码(有些省略了)
//mydll.cpp---------------------------------------------------
// mydll.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
/*
Provided by 王俊川, Northeastern University (www.neu.edu.cn)
Email: blackdrn@sohu.com
This product is free for use.
*/
//////////////////////////////////////////////////////////////////////////
#include "memory.h"
#include "mydll.h"
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// Code starts from Line 130
//////////////////////////////////////////////////////////////////////////
bool Des_Go(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type)
{
if( !( Out && In && Key && (datalen=(datalen+7)&0xfffffff8) ) )
return false;
SetKey(Key, keylen);
if( !Is3DES ) { // 1次DES
for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8)
DES(Out, In, &SubKey[0], Type);
} else{ // 3次DES 加密:加(key0)-解(key1)-加(key0) 解密::解(key0)-加(key1)-解(key0)
for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8) {
DES(Out, In, &SubKey[0], Type);
DES(Out, Out, &SubKey[1], !Type);
DES(Out, Out, &SubKey[0], Type);
}
}
return true;
}
以下省略.....
//////////////////////////////////////////////////////////////////////////
// Code ends at Line 231
//////////////////////////////////////////////////////////////////////////
以下为dll的调用入口点
//mydll.h---------------------------------------------------------------------------
enum {ENCRYPT,DECRYPT};
extern "C" _declspec(dllexport) bool Des_Go(char *Out,char *In,long datalen,const char *Key,int keylen,bool Type = ENCRYPT);
以下是c#调用的的写法
[DllImport("mydll.dll",CharSet=CharSet.Ansi)]
public static extern bool Des_Go(StringBuilder outstr, StringBuilder instr, int datalen,string key,int keylen,bool type);
调用:
private void button1_Click(object sender, System.EventArgs e)
{
StringBuilder outstr = new StringBuilder();
outstr.Append("ABCDEFG");
string key = "123456";
bool b = DES.Des_Go(outstr,outstr,outstr.Length,key,key.Length,false);
byte [] outchars = System.Text.Encoding.Default.GetBytes(outstr.ToString());
this.textBox2.Text = outstr.ToString();
}
结果outchars 和在c++调用后的返回值不一样.
不知道是不是我这样调用不对.还是我的dll写的不对.还望高人不吝赐教.