DELPHI编写的DLL用C#如何调用

山东蓝鸟贵薪 2011-08-31 05:54:22
DELPHI编写的DLL用C#如何调用
...全文
455 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
山东蓝鸟贵薪 2011-09-12
  • 打赏
  • 举报
回复
我用C#重新编写了一个 封装图片功能的DLL,
解决了这个问题
山东蓝鸟贵薪 2011-09-08
  • 打赏
  • 举报
回复
谢谢赐教,我再找找原因...........
mjp1234airen4385 2011-09-08
  • 打赏
  • 举报
回复
另外在delphi里写动态库,不要使用string。
因为delphi中string是delphi自定义的一种数据类型。
大多数编程语言不支持。
使用WideString或PChar
mjp1234airen4385 2011-09-08
  • 打赏
  • 举报
回复
因为,C#中没有TImage这个类型,所以没有办法给你传送参数。
可以改为Bitmap的,这个在C#里Delphi里都支持。
delphi里:
function RandomDPR_text(img:HBITMAP):WideString;stdcall; // 定义随机码

C#里:
string RandomDPR_text(IntPtr img);

调用:
Bitmap bmp = new Bitmap();
...

string Result = RandomDPR_text(bmp.Handle);
山东蓝鸟贵薪 2011-09-08
  • 打赏
  • 举报
回复
真晕,我用C#重新编写了一个DLL,再用C#程序加载即可
但是这个实例还是不行呀
sdl2005lyx 2011-09-07
  • 打赏
  • 举报
回复
楼主,我和# qldsrx(青龙白虎)解释已经还不清楚吗?你怎么还没弄懂啊?
你可以到MSDN,百度、谷歌搜索,也可以弄明白这个问题啊。。。。
兔子-顾问 2011-09-07
  • 打赏
  • 举报
回复
p/invoke
类似系统api,做c导出函数
山东蓝鸟贵薪 2011-09-04
  • 打赏
  • 举报
回复
你的意思我明白呀,但是我说的是如何将这个DELPHI的代码如下:
DLL定义的函数体结构如下:
function RandomDPR_text(img:Timage):string;stdcall; // 定义随机码
var
//定义变量
begin

result:=pwdimgstr;
end;
exports RandomDPR_text;
begin
end.
修改成要是用C#调用这个DLL时,也能识别的代码
andyqq8 2011-09-04
  • 打赏
  • 举报
回复
C#不知道Timage是啥东西,所以无法调用Timage。。。。楼主这样够通俗了吧?
qldsrx 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sgzhou12345 的回复:]
这样 通用化的DLL,任何开发语言都能调用是吧
[/Quote]
说得易懂点,当不同的开发语言之间要调用对方的函数,传递参数时,计算机最终收到的是二进制数据,也就是字节数组,无论是结构体还是类,都是以二进制数据传输的。因此通用化的DLL,参数应该是基本数据类型(INT,FLOAT,DOUBLE,BOOL等)或者byte[],如果用结构体,还必须给出结构体声明,双方构造。像你这种特殊的Timage是不能用在他人调用上的,你要改为TByte后,自己在DELPHI中,根据TBbyte重建Timage,C#可不知道如何建那个Timage类型。
山东蓝鸟贵薪 2011-09-02
  • 打赏
  • 举报
回复
这样 通用化的DLL,任何开发语言都能调用是吧
sdl2005lyx 2011-09-01
  • 打赏
  • 举报
回复
你在

RandomDPR_text(byte buffer[] ,int size)
{
img:Timage =(Timage )buffer; //这个在Delphi怎么转换,我没用过Delphi,你肯定知道
RandomDPR_tex(img); //调用你原来的方法;
}
sdl2005lyx 2011-09-01
  • 打赏
  • 举报
回复
因为Image是每个开发平台自己的类,不能通用,必须在参数封送是转成它们都能识别的东西!
“我这个是一个参数”,楼主,我不是说了吗,你要做DELPHI重新写个方法,在新方法里调用你原来的方法,明白没有?

函数接口可以做成这样:
RandomDPR_text(byte buffer[] ,int size); //这样更直观

对应C#:

RandomDPR_text([In,Out]byte[] buffer,int size);

山东蓝鸟贵薪 2011-09-01
  • 打赏
  • 举报
回复
function RandomDPR_text(img:Timage):string;stdcall; // 定义随机码
我这个是一个参数呀,在C#中用两个参数好用吗??????
sdl2005lyx 2011-09-01
  • 打赏
  • 举报
回复
楼主,非基本类型,都要经过一次处理,变成标准的类型(如:bool ,byte,short,int,double,char*等),才能满足平台调用的要求!

你的函数参数img:Timage,是非标准类型,你要在外层包装,用缓冲区方式:

RandomDPR_text(void* buffer,int size);//DELPHI语法不熟,用C++方式给你范例。

对应C#:

RandomDPR_text(IntPtr buffer,int size);
山东蓝鸟贵薪 2011-09-01
  • 打赏
  • 举报
回复
谢谢赐教,我现在用DELPHI写了一个DLL函数体,
DLL定义的函数体结构如下:
function RandomDPR_text(img:Timage):string;stdcall; // 定义随机码
var
//定义变量
begin

result:=pwdimgstr;
end;
exports RandomDPR_text;
begin
end.
要是用C#调用这个DLL时,如何在C#中写代码
qldsrx 2011-09-01
  • 打赏
  • 举报
回复
编写的DLL不符合通用化标准,无法给其它语言程序调用,完毕!
sdl2005lyx 2011-09-01
  • 打赏
  • 举报
回复
还没看懂啊,楼主!这要跟你说吧:

你的img:Timage这个参数,C#里肯定不能识别,那怎么办呢?
就是想个变通的办法,把这个参数换成两边都能接受的形式,
用void* ,用byte[],都是解决的办法,因为对不同的开发平台,
Image对象都要相应的方法与void*或byte[]进行转换!

这下你明白没有!!!!
sdl2005lyx 2011-08-31
  • 打赏
  • 举报
回复
delphi:

function SetIPAddress(var lpszIPAddress: WideString; dwPortNumber: Integer; dwPassWord: Integer): WordBool;


C#:

[DllImport("xxxx.dll", CharSet=CharSet.Ansi)]
public static extern bool SetIPAddress(string lpszIPAddress, int dwPortNumber, int dwPassWord);

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧