当前位置:编程学习 > C#/ASP.NET >>

C#引用外部dll

项目里用到一个Delphi写的dll,我通过DllImport引入,但不知道如何声明这个加密方法。
Delphi写的加密方法原型是:

function Encode(ClientConnection:Integer; InBuffer:Pointer; InLength:Integer;OutBuffer:Pointer; var OutLength: Integer; Error:PChar):BOOL; stdcall;

功能:加密校验待发送的数据。
输入:
ClientConnection:自己作为客户端时为Comm32中的连接号,否则填-1。
InBuffer:待加密的数据。
InLength:待加密数据的长度。
OutBuffer:存放加密结果的指针,调用者申请内存。
OutLength:OutBuffer指向缓冲的长度。
Error:存放错误信息的指针,调用者必须保证有256字节的空间。
输出:
OutLength:成功时为加密后数据长度,失败时为传入OutLength不足而实际需要的最小长度。
返回:加密成功与否。

请高手帮忙,我在C#中如何声明这个方法。 --------------------编程问答-------------------- 不懂 帮你顶上去 --------------------编程问答-------------------- bool Encode(int ClientConnection,string InBuffer,int InLength,StringBuilder OutBuffer,int OutLength,StringBuilder Error)

--------------------编程问答-------------------- function Encode(ClientConnection:Integer; InBuffer:Pointer; InLength:Integer;OutBuffer:Pointer; var OutLength: Integer; Error:PChar):BOOL; stdcall;

按照如下对应数据类型
ClientConnection:int
InBuffer:String
InLength:int
OutBuffer:Out关键字,传入String类型
OutLength:Out关键字,传入int类型
Error:Ref关键字,传入String类型
输出:
OutLength:成功时为加密后数据长度,失败时为传入 OutLength不足而实际需要的最小长度。
返回:加密成功与否。

在。net中,输出参数,需要添加Out关键字。

然后这样:
using System;
using System.Runtime.InteropServices;

[DllImport("c:\\dll\\yourdll.dll", CharSet = CharSet.Ansi ,CallingConvention=CallingConvention.StdCall , EntryPoint = "Encode")]
  public static extern bool Encode(int ClientConnection, string InBuffer, int InLength,Out string Buffer; out int OutLength, ref string Error)



参考资料:http://blog.csdn.net/tangl_99/archive/2006/09/06/1182354.aspx
--------------------编程问答-------------------- [DllImport("c:\\dll\\yourdll.dll", CharSet = CharSet.Ansi ,CallingConvention=CallingConvention.StdCall , EntryPoint = "Encode")]
  public static extern bool Encode(int ClientConnection, IntPtr InBuffer,ref int InLength,IntPtr Buffer; ref int OutLength, IntPtr Error)

注意下,参数不要使用string,否则可能由于字符串结束标记导致你传入的信息丢失!
输入部分:
使用IntPtr lpBuffer =Marshal.AllocHGlobal(1024);
可以分配一个非脱管的内存区域,用来存放输入的值,操作也比较简单,可以将IntPtr转换为Byte * 进行操作。
输出也是同理。
错误代码:Marshal.PtrToStringAuto(lpError);
PChar类型参数也可以使用 ref stringbuilder替代 --------------------编程问答-------------------- 额           晕     .......... --------------------编程问答--------------------
引用 4 楼 zhu_jiang 的回复:
[DllImport("c:\\dll\\yourdll.dll", CharSet = CharSet.Ansi ,CallingConvention=CallingConvention.StdCall , EntryPoint = "Encode")]
  public static extern bool Encode(int ClientConnection, IntPtr InBuf……

怎么把字符串转换IntPtr 类型进行传递啊? --------------------编程问答-------------------- IntPtr lpInBuffer = System.Runtime.InteropServices.Marshal.AllocHGlobal(1024);
byte[] btyes = System.Text.Encoding.ASCII.GetBytes(str);
System.Runtime.InteropServices.Marshal.Copy(btyes,0,lpInBuffer,btyes.Length);

我是建立在输入缓冲区非string的假设上,如果输入为string,那么delphi中InBuffer:Pointer
应该声明为InBuffer:PChar
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,