问题描述
我有一个win32 C dll。我需要在C#代码中调用此dll的功能。我正在用C写一个包装dll。在包装dll中,我调用原始win32 dll的函数,然后在C#代码中调用包装dll的函数。 包装器dll的功能签名如下:
外部“ C” __ declspec(dllexport)int TDESEncrypt_with_Provided_Key(未签名的字符 Enc_Mode,未签名的字符 FileName,未签名的字符* HSMPIN, unsigned char * Key,int Key_Length,unsigned char * Clear_Data, int Clear_Data_Length,unsigned char * Encrypted_Data,int Encrypted_Data_Length,int slotId);
此函数获取Clear_Data,对其进行加密,然后将加密的数据复制到Encrypated_Data参数中。
我正在C#代码中导入此函数,如下所示:
[DllImport(@“”,CallingConvention = CallingConvention.Cdecl)] 私有静态外部int TDESEncrypt_with_Provided_Key(字节[]加密模式,字节[]文件名,字节[] HSM_PIN,字节[]密钥名, int keyname_length,byte [] Enctypred_Data,ref long Encrypted_Data_Length, byte [] Clear_Data,长Clear_Data_Length,int Slod_ID);
我正在按如下方式调用此包装dll函数:
long data_size_enc = 0;
int Slot = 0;
byte[] LogFileName;
string Enc_Text = "";
byte[] Key_bytes = new byte[8];
byte[] enc_data_bytes = new byte[8];
byte[] clear_bytes = new byte[8];
byte[] encryption_mode = new byte[3];
byte[] HSM_PIN = new byte[4];
Key_bytes = Utility.ToByteArray(key,System.Globalization.NumberStyles.HexNumber);
byte[] clear_data_bytes = Utility.ToByteArray(data.ToString(),System.Globalization.NumberStyles.HexNumber);
enc_data_bytes = Utility.ToByteArray("0000000000000000",System.Globalization.NumberStyles.HexNumber);
encryption_mode = Utility.ToByteArray("ECB",System.Globalization.NumberStyles.None);
HSM_PIN = Utility.ToByteArray(<pin>,System.Globalization.NumberStyles.None);
LogFileName = Encoding.ASCII.GetBytes(<log file name>);
int结果= TDESEncrypt_with_Provided_Key(encryption_mode,LogFileName,HSM_PIN,Key_bytes,Key_bytes.Length,enc_data_bytes, ref data_size_enc,clear_data_bytes,clear_data_bytes.Length,HSM_Slot);
Enc_Text = Utility.ToByteString(enc_data_bytes);
除了一个非常奇怪的问题之外,一切都工作正常。当我第一次调用该函数时,会得到正确的结果。但是,当我再次调用该函数而不重新启动程序时,包装器dll的enc_data_bytes没有任何显示。
如果我通过附加C#exe调试dll,则可以看到dll将正确的数据放入Encrypted_Data中,但是由于某些原因,第二次调用该函数时C#代码无法获取此数据。 / p>
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)