博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

delphi 调用 C# COM DLL 解析C#数据集

Posted on 2013-06-03 13:07  对镜弹箜篌  阅读(543)  评论(0编辑  收藏  举报
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 using System.Runtime.InteropServices;
 5 using System.Net.Sockets;
 6 using System.Net;
 7 using System.Data;
 8 using System.IO;
 9 using System.IO.Compression;
10 using System.Runtime.Serialization.Formatters.Binary;
11 
12 namespace cstcp
13 {
14     public interface ICSTCPClass
15     {
16         string rtMsg();
17         bool SetHost(string host, string port);
18         //
19         bool SetDict1(string uid,ref string rMsg, IntPtr PData, int PDataLength);
20     }
21 
22     [ClassInterface(ClassInterfaceType.None)]
23 
24     public class CSTCPClass : ICSTCPClass
25     {
26         public string rHost = "";
27         public string rPort = "";
28         public const int HeadBufferSize = 16;
29         public const int StreamBufferSize = 65536;
30 
31         public string rtMsg()
32         {
33             return "this is a result string";
34         }
35 
36         public bool SetHost(string host, string port) 
37         {
38             rHost = host;
39             rPort = port;
40             return true;
41         }
42 
43 
44 
45 
46         //BYTE数组转消息类(反序列)
47         public static object byteToOb(byte[] t_byte)
48         {
49             object dsResult = null;
50             try
51             {
52                 if (t_byte == null) return null;
53                 MemoryStream mStream = new MemoryStream(t_byte);
54                 mStream.Seek(0, SeekOrigin.Begin);
55                 DeflateStream unZipStream = new DeflateStream(mStream, CompressionMode.Decompress, true);
56                 BinaryFormatter bFormatter = new BinaryFormatter();
57                 dsResult = (object)bFormatter.Deserialize(unZipStream);
58                 //dsResult = (object)bFormatter.Deserialize(mStream);
59             }
60             catch
61             {
62                 return null;
63             }
64             return dsResult;
65         }
66         public bool SetDict1(string uid, ref string rMsg, IntPtr PData, int PDataLength)
67         {
68             try
69             {
70                 byte[] b = new byte[PDataLength];
71                 Marshal.Copy(PData, b, 0, PDataLength);
72                 DataSet ds = (DataSet)byteToOb(b);
73   
74                 if (ds != null) 
75                 {   
76                     DataTable dt = ds.Tables[0];
77                     dt.WriteXml("C:\\111.xml");
78                     rMsg = "解析成功";
79                     return true;
80                 }
81                 rMsg = "解析失败";
82                 return false;
83             }
84             catch(Exception ex)
85             {
86                 rMsg= ex.Message.ToString();
87                 return false;
88             }
89         }
90     }
91 
92 }

编译时设置 属性->生成->输出->勾选 为COM Interop注册选项

注册COM脚本:

%WINdir%\Microsoft.NET\Framework\v2.0.50727\regasm.exe tcpcom.dll /tlb:tcpcom.tlb /codebase
pause

调用方法:Delphi7为例

Project->Import Type Library->选择刚注册的tcpcom(com模块名)->Create Unit

1 uses tcpcom_TLB;
2 procedure TForm1.Button1Click(Sender: TObject);
3 var
4   t:TCSTCPClass;
5 begin
6   t:= TCSTCPClass.Create(self);
7   t.SetHost('127.0.0.1','8080') ;
8   t.Free;
9 end;