这两天一直在研究用.net 调用非托管dll,项目准备用c#写服务器端的逻辑处理以及WebService,中间采用Soap传输数据,客户端软硬件环境以及网络环境都比较复杂,尽量采用少干预客户端比较好,最终采纳用Delphi写客户端应用程式,毕竟在客户的终端机器上装.net framework太过于庞大,尤其是在配置很低的机器上。当然数据传输就必须有压缩加密的过程,要想在不同语言之间实现同一套压缩算法还是比较麻烦的,于是想出一个比较简单的处理方式,压缩算法采用Dephi自带的ZLIB,加密采用DES然后写成COM。
1.在Delphi中创建一个ActiveX Library Project,再增加一个Automation Object单元,自动帮你创建一个COM接口单元,定义好接口函数,注意返回类型用wideString

.NET调用非托管程式(COM篇)unit Compress;
.NET调用非托管程式(COM篇)
.NET调用非托管程式(COM篇){$WARN SYMBOL_PLATFORM OFF}
.NET调用非托管程式(COM篇)
.NET调用非托管程式(COM篇)interface
.NET调用非托管程式(COM篇)
.NET调用非托管程式(COM篇)uses
.NET调用非托管程式(COM篇)  ComObj, ActiveX, ZlibCompress_TLB, StdVcl;
.NET调用非托管程式(COM篇)
.NET调用非托管程式(COM篇)type
.NET调用非托管程式(COM篇)  TZLibCompress = class(TAutoObject, IZLibCompress)
.NET调用非托管程式(COM篇)  protected
.NET调用非托管程式(COM篇)    function CompressData(const sData: WideString): WideString; safecall;
.NET调用非托管程式(COM篇)    function unCompressData(const sData: WideString): WideString; safecall;
.NET调用非托管程式(COM篇)    function DeCryptData(const aStr, aKey: WideString): WideString; safecall;
.NET调用非托管程式(COM篇)    function EnCryptData(const aStr, aKey: WideString): WideString; safecall;
.NET调用非托管程式(COM篇)    { Protected declarations }
.NET调用非托管程式(COM篇)  end;
.NET调用非托管程式(COM篇)
.NET调用非托管程式(COM篇)implementation
.NET调用非托管程式(COM篇)
.NET调用非托管程式(COM篇)uses ComServ,uSoapPacketComUnCompressor,DES;
.NET调用非托管程式(COM篇)
.NET调用非托管程式(COM篇)//==============================================================================
.NET调用非托管程式(COM篇)// Compress Data
.NET调用非托管程式(COM篇)//==============================================================================
.NET调用非托管程式(COM篇)function TZLibCompress.CompressData(const sData: WideString): WideString;
.NET调用非托管程式(COM篇)begin
.NET调用非托管程式(COM篇)   Result := XTToCompressSoapPacket(sData);
.NET调用非托管程式(COM篇)end;
.NET调用非托管程式(COM篇)
.NET调用非托管程式(COM篇)//==============================================================================
.NET调用非托管程式(COM篇)// UnCompress Data
.NET调用非托管程式(COM篇)//==============================================================================
.NET调用非托管程式(COM篇)function TZLibCompress.unCompressData(const sData: WideString): WideString;
.NET调用非托管程式(COM篇)begin
.NET调用非托管程式(COM篇)   Result := XTToUnCompressSoapPacket(sData);
.NET调用非托管程式(COM篇)end;
.NET调用非托管程式(COM篇)
.NET调用非托管程式(COM篇)//==============================================================================
.NET调用非托管程式(COM篇)// Decrypt Data
.NET调用非托管程式(COM篇)//==============================================================================
.NET调用非托管程式(COM篇)function TZLibCompress.DeCryptData(const aStr,
.NET调用非托管程式(COM篇)  aKey: WideString): WideString;
.NET调用非托管程式(COM篇)begin
.NET调用非托管程式(COM篇)   Result := DeCrypt(aStr,aKey);
.NET调用非托管程式(COM篇)end;
.NET调用非托管程式(COM篇)
.NET调用非托管程式(COM篇)//==============================================================================
.NET调用非托管程式(COM篇)// Encrypt Data
.NET调用非托管程式(COM篇)//==============================================================================
.NET调用非托管程式(COM篇)function TZLibCompress.EnCryptData(const aStr,
.NET调用非托管程式(COM篇)  aKey: WideString): WideString;
.NET调用非托管程式(COM篇)begin
.NET调用非托管程式(COM篇)   Result := EnCrypt(aStr,aKey);
.NET调用非托管程式(COM篇)end;
.NET调用非托管程式(COM篇)
.NET调用非托管程式(COM篇)initialization
.NET调用非托管程式(COM篇)  TAutoObjectFactory.Create(ComServer, TZLibCompress, Class_ZLibCompress,
.NET调用非托管程式(COM篇)    ciMultiInstance, tmApartment);
.NET调用非托管程式(COM篇)end.
.NET调用非托管程式(COM篇)

2.在.Net项目中引用此COM文件,采用如下方式调用对应的接口

.NET调用非托管程式(COM篇)if(this.textBox1.Text == string.Empty)
            }

3.客户端程式不需要调用COM直接引用算法的单元文件即可。

示例代码:https://files.cnblogs.com/arping/testCOM.rar

相关文章: