DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: szliyu112358
今日帖子: 52
在线用户: 14
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 changfenglee (葫芦老四) ▲▲▲▲▲ -
普通会员
2022/11/23 20:06:25
标题:
请教关于DELPHI调用C#编写DLL库问题 浏览:1639
加入我的收藏
楼主: 关于使用DELPHI调用C#编写的DLL库原来没有玩过,我按搜索的资料进行了尝试,但不能成功,想请教各位看看能否指点一下

【以下是C#编写的DLL库信息】

DLL文件名称:DaioPrgInterface.dll

别人提供给我的说明如下:
public class Auxiliary
        public string GetInterfaceVersion()

当然,还有很多的信息,我只贴了这一个

我按教程的信息是这么编写的代码,但是会报错,因为没有玩过,所以不清楚发生了什么事情
var
  Obj:Variant;
  InterfaceVersion:string;
begin
  Obj:=CreateOleObject('DaioPrgInterface.Auxiliary');
  InterfaceVersion:=Obj.GetInterfaceVersion;
  ShowMessage(InterfaceVersion);
  Obj.free;

报错的信息如下:
此帖子包含附件:
PNG 图像
大小:3,867B
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2022/11/23 20:23:22
1楼: read this:
https://stackoverflow.com/questions/49026910/how-to-use-a-dll-created-with-c-sharp-in-delphi

https://stackoverflow.com/questions/6174584/call-c-sharp-dll-from-delphi
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 changfenglee (葫芦老四) ▲▲▲▲▲ -
普通会员
2022/11/24 8:41:29
2楼:
我换了一种方式如下:

function GetInterfaceVersion:string; stdcall; external 'DaioPrgInterface.dll';

然后在按钮的点击事件中这样写:

procedure TForm1.Button2Click(Sender: TObject);
begin
   ShowMessage(GetInterfaceVersion);
end;

同样也出现了错误,是否C#输出的DLL文件有输出的要求呢?
此帖子包含附件:
PNG 图像
大小:7.0K
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
男 hsj (hsj) ★☆☆☆☆ -
盒子活跃会员
2022/11/24 13:41:09
3楼: 都是c#调用delphi的dll,你这么弄没搞过,如果C#的dll是你自己写的话,写成exe,delphi里直接运行exe不更简单?
----------------------------------------------
qq:171833017,靖源软件http://www.dxmylove.com
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2022/11/25 1:18:54
4楼: 第二种肯定不行,因为你写的是COM类型的DLL,第一种,假设没有其他问题,运行过regsvr32注册DLL了么?
----------------------------------------------
-
作者:
男 qq81709989 (战石电子) ▲▲△△△ -
普通会员
2022/11/25 10:13:56
5楼: 我也调用过公司未曾谋面的某前辈大佬用C#写的dll(据说大佬去华为了,离职的时候没有交接关键的dll源代码),嫌调试太麻烦,我直接用.Net Reflector 反编译出了C#代码,然后翻译成了Pascal代码,问题完美解决!
----------------------------------------------
《Z-Gantt智慧时间管理进度计划甘特图软件》:WWW.Z-SHi.NET
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2022/11/25 10:59:52
6楼: C# 用DNSpy 直接开源码,咋弄都行。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 kngstr (KngStr) ▲▲▲▲△ -
普通会员
2022/11/25 14:27:59
7楼: C#调用的常见于COM方式,不过这个要注册dll才可以。
不注册dll的话,可以看看这里:
DDNRuntime-Delphi调用.NET的库(非COM方式调用Framework和Core)
http://bbs.2ccc.com/topic.asp?topicid=621485
----------------------------------------------
-
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2022/11/26 14:25:26
8楼: jcvl 也能调用c#写的dll,不需要系统注册...
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 changfenglee (葫芦老四) ▲▲▲▲▲ -
普通会员
2022/11/28 12:02:29
9楼: 因为这个C#的DLL是设备厂商提供的,有一份涵数调用说明,但我尝试了好几种方式都无法调用成功
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
男 changfenglee (葫芦老四) ▲▲▲▲▲ -
普通会员
2022/11/28 13:44:47
10楼: 我担心是之前的DLL文件有问题,重新做了一个C#的DLL文件,

【C#里面的编码如下】:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace mydll
{
    public class mydll
    {
        public static double myfunction(double a1, double a2)
        {
          return (a1 + a2);
        }
    }
}

【然后我在DELPHI中这样调用的】:

var
  Obj:Variant;
  i:Double;
begin
  Obj:=CreateOleObject('mydll.mydll');
  i:=obj.myfunction(12,15);
  ShowMessage(FloatToStr(i));
  Obj.free;
报的错误与题目内容是一样的

换成下面这种方法,错误也是一样

implementation

function myfunction(a1,a2:double):double; stdcall; external 'mydll.dll';

procedure TForm1.Button2Click(Sender: TObject);
var
   i:Double;
begin
   i:=myfunction(12,15);
   ShowMessage(FloatToStr(i));
end;

麻烦各位高手指点一下,有什么是我没有做的吗?
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
男 changfenglee (葫芦老四) ▲▲▲▲▲ -
普通会员
2022/11/28 14:34:00
11楼: 我对C#的源码又进行了一下修改,改成下面这样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace mydll
{
    public class mydll
    {
        public interface Imydll
        {
          void myfunction(double a1, double a2);
        }
        public static double myfunction(double a1, double a2)
        {
          return (a1 + a2);
        }
    }
}

然后我做了一个bat文件进行DLL注册

@echo 开始注册
regsvr32 mydll.dll /s
@echo 注册成功
@pause

在DELPHI里面调用的方法不变,错误依旧存在

现在不清楚是什么原因了
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
男 esmall (esmall) ▲▲▲▲▲ -
普通会员
2022/11/28 18:26:04
12楼: 请看看这篇文章:
https://www.cnblogs.com/huangcong/archive/2010/10/06/1844542.html
----------------------------------------------
-
作者:
男 jljaaj (小强) ▲▲▲△△ -
普通会员
2022/11/29 10:27:10
13楼: 这个文章够细致得了!!
https://blog.csdn.net/m0_37876197/article/details/121339364?spm=1035.2023.3001.6557&utm_medium=distribute.pc_relevant_bbs_down_v2.none-task-blog-2~default~OPENSEARCH~Rate-2-121339364-bbs-270076611.pc_relevant_bbs_down_v2_default&depth_1-utm_source=distribute.pc_relevant_bbs_down_v2.none-task-blog-2~default~OPENSEARCH~Rate-2-121339364-bbs-270076611.pc_relevant_bbs_down_v2_default
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2022/11/29 13:38:30
14楼: C#导出的类和函数的声明上缺attribute声明
  13.    [Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]  
  14. 
  15.    public interface MyCom_Interface  
  16. 
  17.    {  
  18. 
  19.        [DispId(1)]  
  20. 
  21.        int Add(int a, int b);  
  22. 
   }
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2022/11/29 15:56:25
15楼: 1.C# 不能编写标准DLL 文件
所以 想不动C#源码 实现调用 除非调用CLR
也就是那些号称可以调用C#的组件  都是收费的

2.C#可以编写COM  DLL
然后通过注册 不是常规的reg32  而是注册.net程序集 regasm 好像叫这个
然后才可以通过对象调用

3.厂商提供的C# DLL的话 你要问清楚支不支持 COM  如果不支持那么久不能调用。

或者问清楚支不支持除了C#之外的语言也可以

4.可能的解决方案是
假设提供的DLL不能直接用 那么可以考虑自己重新写一个C# DLL  来包装成COM  这样达到调用的效果。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行500毫秒 RSS