分享一次C#调用Delphi编写Dll程序
1.前言:
最近接手了一个项目需要和Delphi语言编写的一个系统进行一些接口的对接,数据在传输过程中采用Des加密方式,因为Delphi 平台的加密方式和C#平台的加密方式不互通,所以采用的方式是C#通过调用Delphi编写好的Dll通过C#中的DllImport进行数据的加解密,其实原本是很简单的一个过程,在中间遇到了一些坑,希望能够分享这次经验,能够避免更多的人踩到这个坑;
2.后续
C#和delphi平台对接的接口
Delphi
有两个方法:
Estr加密,参数1:加密参数,参数2:秘钥
DeStr解密:参数1:解密参数,参数2:秘钥

C#
通过DllImport引用Dll,然后定义好方法和参数,把对应的Dll放到程序生成的Bin目录下


最后传入参数调用方法,原以为到这里就可以结束,接下来就可以写后面的业务逻辑了,
想法很美好,结果有点天真,程序直接执行到调用方法的时候
出现了第一个错误:
关于无法加载DLL"":找不到指定的模块(异常来自HRESULT:0x8007007E)
找到的解决方式是将项目生成里面的目标平台修改成X86,目的是在64位系统上兼容32位的程序,然后也同时将对应的Dll放入到了C:\Windows\System32,C:\Windows\SysWOW64这两个目录下
然后我按照步骤去操作,发现我的项目是网站,不存在目标平台可以去设置,考虑到WebApi那块也需要调用到这个Des加解密,就把代码拷贝了过去进行调试,执行到加密的那段代码的时候,直接VS程序先卡主,然后运行调试状态直接关闭了,try异常都不抛出,有点无奈,找了半天C# DllImport
Dll 执行错误的解决方案,也没有找到,后续为了方便调试就写了一个winfrom窗体程序,然后我一开始是用得vs2015开发网站(因为vs2019运行网站会报错这个报错的过程忽略掉),在调试这个winfrom程序的时候,执行程序到对应的代码可以执行成功,成功加密和解密对应的数据,然后我用vs2015打开这个窗体程序,得到执行失败的结果,这时候更懵了,后面脑子一闪以前在sql报错的时候在系统日志中能够查到对应的记录,我想这种错误应该也能找得到,最后找到那条记录日志错误内容是:
出现了第二个错误:
错误应用程序
w3wp.exe,版本
7.0.6001.18000,时间戳
0x47919413,错误模块
ntdll.dll,版本
6.0.6001.18000,时间戳
0x4791a7a6,异常代码
0xc0000374,错误偏移量
0x000b015d, 进程
ID 0xcc4,应用程序启动时间
0x01cd5de08c54b3ac,然后通过这个一搜索,搜索到了
文章:https://q.cnblogs.com/q/38510

解决方案是用StringBuilder 替换string参数,执行还是报错,从这个结局方案中得到了一点头绪,后续继续找delphi 中Pchar的相关资料,后续通过不断的修改调试,发现在C#中和delphi 中PChar想中相对应的数据类型是IntPtr 然后修改成以下就可以成功了

总结:
以后这种接口对接的问题能够先更多熟悉双方语言基础的一些语法,方便在对接过程中更有效的沟通;
疑问:
为什么在vs2019中调用成功而在Vs2015中却出现了系统级别的日志;
分享一次C#调用Delphi编写Dll程序的更多相关文章
- delphi编写dll心得, 谢谢原作者的分享。转
delphi编写dll心得 1.每个函数体(包括exports和非exports函数)后面加 'stdcall;', 以编写出通用的dll2.exports函数后面必须加'export;'(放在'st ...
- nodejs调用delphi编写的dll
公司的业务需要,nodejs要读取文件版本号. 同事要求我用delphi编写dll,以供nodejs调用,结果通过json返回. delphi代码如下: function GetFileInfo(AP ...
- Delphi调用C# 编写dll动态库
Delphi调用C# 编写dll动态库 编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目WZPayDll, using System.Runtime.InteropServices ...
- 浅谈C++调用C#的DLL程序方法
把C#编译成DLL或者Axtive控件,再由C调用!比如使用C++调用C#的DLL. SwfDotNet是.net下输出flash的类库.SwfDotNet是C#编写的,作者的C#水平,真是令我佩服. ...
- [JNA系列]Java调用Delphi编写的Dll之JNA使用
介绍 给大家介绍一个最新的访问本机代码的 Java 框架 —JNA . JNA(Java Native Access) 框架是一个开源的 Java 框架,是 SUN 公司主导开发的,建立在经典的 JN ...
- C# 调用delphi编写的dll
技术实现 如何逐步实现动态库的加载,类型的匹配,动态链接库函数导出的定义,参考下面宏定义即可: #define LIBEXPORT_API extern "C" __declspe ...
- Qt调用Delphi编写的COM组件
这个问题捣鼓了两天,现在终于解决了,做个笔记分享给大家,以免走弯路 起初,我的想法是在DLL中写一个interface并从函数中导出这个interface,像这样的代码 ICom1 = interfa ...
- Delphi 编写DLL动态链接库文件的知识
一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...
- Delphi 编写DLL动态链接库文件的知识和样例(有详细步骤,很清楚)
一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...
随机推荐
- logstash output kafka ip 设置的坑
原设置 output { kafka { acks => " enable_metric => false codec => "json" topic_ ...
- html,将元素水平,垂直居中的四种方式
将元素垂直,水平居中分两种情况:一个是元素尺寸固定,二是元素尺寸不固定 一.尺寸固定 方法1:定位 ,50%,margin负距 .box{ width: 400px; height: 300px; b ...
- CPU时间分片、多线程、并发和并行
1.CPU时间分片.多线程? 如果线程数不多于CPU核心数,会把各个线程都分配一个核心,不需分片,而当线程数多于CPU核心数时才会分片. 2.并发和并行的区别 并发:当有多个线程在操作时,如果系统只有 ...
- C# 开启线程的几种方式
1.异步委托开启线程 public static void Main(string[] args) { Action<int,int> a=add; a.BeginInvoke(,,nul ...
- 题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵
原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai&a ...
- 吴裕雄--天生自然 R语言开发学习:中级绘图(续一)
#------------------------------------------------------------------------------------# # R in Action ...
- 使用内网映射工具Holer将本地的Web应用映射到公网上访问
Holer exposes local servers behind NATs and firewalls to the public internet over secure tunnels. Su ...
- <USACO06NOV>玉米田Corn Fields
状压emm 二进制真有趣 来自dp垃圾的欣喜 Description 农民 John 购买了一处肥沃的矩形牧场,分成M*N(1 <= M <= 12; 1 <= N <= 12 ...
- numpy学习总结
Contents Numpy是一个用python实现的科学计算包,主要提供矩阵运算的功能,而矩阵运算在机器学习领域应用非常广泛,Numpy一般与Scrapy.matplotlib一起使用. Numpy ...
- 软工 实验一 Git代码版本管理
实验目的: 1)了解分布式版本控制系统的核心机理: 2) 熟练掌握git的基本指令和分支管理指令: 实验内容: 1)安装git 2)初始配置git ,git init git status指令 3 ...