.net 调用delphi 的DLL

本文介绍了一个使用C#实现的Socket通信示例,包括客户端连接、发送和接收数据的具体实现,并展示了如何调用外部DLL完成特定任务。此外,还提供了一个XML数据处理的例子。

首先是类文件

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.在调用的地方,可根据自己的需求写,这只是个我用的方法。

本方案用提供Delphi7.NET程序的协同开发, .NET程序开发服务端, Delphi7客户端。客户端只需实现界面、用户输入操作 及错误显示(提示),其他操作(包括对客户端数据集或者单条记录的校验都是发回到服务端进行的)都在服务端完成。服务端 支持部署在Web服务器(IIS, Webservice)或者独立服务器(可作为Windows程序独立运行或者Windows服务运行,TCP协议)。 "友一分销管理系统"是基于该框架实现的,详见"POS管理用户手册.doc",初始设置见"Readme.doc"。 一 .NET(C#)服务组件说明 .NET(C#)服务组件开发基于DotNetFrame4.0, 服务端集成Castle实现对AOP的支持。只要在项目中引用BuleCommon.dll程序集, 类(Class)继承于BuleCommon.BuEntity.BuEntityObj, 并且在类和方法前指定[BuleCommon.BuEntity.BuEntityAttribute()] 特性, 实现Bule_EntityRegClass : IBule_EntityRegClass注册类完成服务组件注册即可。 服务组件类框架: using BuleCommon; using BuleCommon.BuEntity; namespace BuJxcData { [BuEntity()] //使客户端能获取该服务组件(class) public class BuIOBillValidate : BuEntityObj { [BuEntity(BuEntityMethod.bemValidate)] //使客户端能获取该服务组件单记录校验方法 public virtual bool Buf_CallCalcFields(ref BuleEntityCall EntityData, ref BuRecordSet RecordSet) { } [BuEntity(BuEntityMethod.bemValidates)]//使客户端能获取该服务组件多记录校验方法 public virtual bool Buf_RefreshPriceList(ref BuleEntityCall EntityData, ref DataSet ds) { } } [BuEntity()] //使客户端能获取该服务组件(class) public class BuCustomers : BuEntityObj { [BuEntity(BuEntityMethod.bemGetName)]//使客户端能获取该服务组件根据代码获取信息方法 public BuRecordSet Buf_GetCustData(ref BuleEntityCall EntityData) { } } [BuEntity()]//使客户端能获取该服务组件(class) public class BuStockCgInBill : BuEntityObj { [BuEntity(BuEntityMethod.bemOpen)]//使客户端能获取该服务组件打开方法 public virtual DataSet Buf_OpenBillData(ref BuleEntityCall EntityData) { } [BuEntity(BuEntityMethod.bemSave)]//使客户端能获取该服务组件保存方法 override public bool Buf_SaveBillData(ref BuleEntityCall EntityData, ref DataSet ds) { } [BuEntity(BuEntityMethod.bemAudit)]//使客户端能获取该服务组件审核方法 public bool Buf_SaveCgInAuditBill(ref BuleEntityCall EntityData, ref DataSet ds) { } } } 二. Bule VCL组件说明 1.Bu_ClientObj 用于提供模块注册信息(模块名称,子系统编号,模块编号等)及访问服务器的方法(通
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值