天天看點

.net 調用delphi 的DLL

首先是类文件

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Xml;

namespace Common
{
    public class SocketWbHelper
    {
        [DllImport(@"D:\delphi_test.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern bool Submit(int iMainType, byte[] pchar_in, int len_in, byte[] pchar_out, ref int len_out);

        private static object obj = new object();

        /// <summary>
        /// Socket发送数据处理
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static Socket ConnectSvr()
        {
            string sip = System.Configuration.ConfigurationManager.AppSettings["SockIP"];
            IPAddress ip = IPAddress.Parse(sip);
            IPEndPoint ipe = new IPEndPoint(ip, 35232);
            Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            c.Connect(ipe);
            return c;
        }

        /// <summary>
        /// Socket发送数据处理
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static Socket CloseConnectSvr(Socket c)
        {
            c.Shutdown(SocketShutdown.Both);
            c.Close();
            return c;
        }

        /// <summary>
        /// Socket发送数据处理
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static List<string> SendMsg(string str, Socket c)
        {
            lock (obj)
            {
                byte[] bsHead = BitConverter.GetBytes(2875566949);
                byte[] bsData = Encoding.Default.GetBytes(str);
                byte[] bsDataLength = BitConverter.GetBytes(bsData.Length);
                byte[] bsNull = BitConverter.GetBytes(0);
                byte[] bsSend = new byte[bsData.Length + 20];

                bsHead.CopyTo(bsSend, 0);
                bsDataLength.CopyTo(bsSend, 4);
                bsNull.CopyTo(bsSend, 8);
                bsNull.CopyTo(bsSend, 12);
                bsNull.CopyTo(bsSend, 16);
                bsData.CopyTo(bsSend, 20);

                List<string> list = new List<string>();

                byte[] recvBytes = new byte[20];
                byte[] recvBytesEnd = null;
                StringBuilder recvStrSb = new StringBuilder();

                try
                {
                    c.Send(bsSend, bsSend.Length, 0);
                    int bytes = 0;
                    bytes = c.Receive(recvBytes, recvBytes.Length, 0);
                    if (bytes > 0)
                    {
                        //获取到返回信息的长度
                        int lenth = BitConverter.ToInt32(recvBytes, 4);
                        recvBytesEnd = new byte[lenth];

                        bytes = c.Receive(recvBytesEnd, recvBytesEnd.Length, 0);
                        recvStrSb.Append(Encoding.Default.GetString(recvBytesEnd, 0, bytes));
                    }

                    list.Add("0");
                    list.Add(recvStrSb.ToString());
                }
                catch { list.Add("-10001"); }
                return list;
            }
        }

        
        /// <summary>
        /// Socket发送数据处理
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static string MsgSend(string str,out int iResult,string sywid)
        {
            iResult = 0;
            byte[] bsSend = Encoding.Default.GetBytes(str);
            List<string> list = new List<string>();

            StringBuilder recvStrSb = new StringBuilder();

            byte[] outpchar = new byte[20000];
            int out_len = 20000;
            bool bResult = false;
            try
            {
                bResult = Submit(Convert.ToInt32(sywid), bsSend, bsSend.Length, outpchar, ref out_len);
            }
            catch (Exception ex)
            {
                iResult = -1;
                return "失败Submit:" + ex.Message;
            }
            try
            {
                if (bResult == true)
                {
                    recvStrSb.Append(Encoding.Default.GetString(outpchar, 0, out_len));
                }
                else
                {
                    iResult = -2;
                    recvStrSb.Append(Encoding.Default.GetString(outpchar, 0, out_len));
                    recvStrSb.Append(",接口调用失败!out_len:" + out_len);
                }
            }
            catch (Exception ex)
            {
                iResult = -3;
                return "失败recvStrSb:out_len," + out_len + "::" + ex.Message;
            }
            return recvStrSb.ToString();
        }

        /// <summary>
        /// 获取XML对象
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static XmlDocument GetXMLDoc(string str)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(str.ToString());
            return xmlDoc;
        }
    }
}
           

以下是调用方法

private static ReturnDto SendSortInfo(string sRevMobile, string iRevProductid, string sAccount, int iTime=0, string sName = "桔子", string sywid = "1")
        {
            var sSendData = "<?xml version=\"1.0\" encoding=\"GB2312\"?><xml><sRevMobile>" + sRevMobile + 
                "</sRevMobile><iRevProductid>" + iRevProductid +
                "</iRevProductid><iTime>" + iTime +
                "</iTime><sAccount>" + sAccount +
                "</sAccount><sName>" + sName +
                "</sName></xml>";

            var model = new ReturnDto();
            int iInterfaceResult = 0;
            string listResult = SocketWbHelper.MsgSend(sSendData, out iInterfaceResult, sywid);

            if (iInterfaceResult < 0)
            {//查询异常
                if (iInterfaceResult == -2)
                {
                    //接口返回错误信息
                    XmlDocument docValue = new XmlDocument();
                    docValue.LoadXml(listResult);
                    model.msg = docValue.SelectNodes("//Msg")[0].InnerText;
                }
                else
                {
                    model.msg = listResult;
                }
                model.code = -1;
                return model;
            }
            else
            {
                var docValue = new XmlDocument();
                docValue.LoadXml(listResult);
                model.msg = docValue.SelectNodes("//Msg")[0].InnerText;
            }

            model.code = model.msg.Trim().ToLower().Equals("ok") ? 1 : -2;

            return model;
        }
           

注意:

1.DLL的路径要用绝对路径,如果要用相对路径的话,自己要放在对的位置。

2.这个demo用的是 XML 参数传递方式,传入和返回都是XML。

3.在调用的地方,可根据自己的需求写,这只是个我用的方法。