因为工作需求,本来想用C#做一个WebService,但是弄了两天没做成。于是想,反正都是我这一台电脑,做个DLL吧。

 1 namespace U8Service
2 {
3 public interface IMyFunc
4 {
5 int Jia(int a, int b);
6 int Jian(int a, int b);
7 }
8 [ClassInterface(ClassInterfaceType.None)]
9 public class MyFunc : IMyFunc
10 {
11 public int Jia(int a, int b)
12 {
13 return (a + b);
14 }
15
16 public int Jian(int a, int b)
17 {
18 return (a - b);
19 }
20 }
21
22 }

C#里代码就得这么写,如果不写IMyFunc的定义的话,生成的DLL里是空的。

然后在程序集信息里,要把这一项勾选。

另外在输出选项中,这一项也需要勾选上:

这一项如果不勾选,生成DLL后,有几个情况:

1、因为没有TLB文件,所以只能使用Import .NET Assembly直接加载DLL,DELPHI程序能编译通过,但是运行时会报一个错:

2、使用regasm u8service.dll 对DLL进行注册,会提示:

regasm u8service.dll /tlb:u8service.tlb 这种方式我也试过了,仍然不行。

所以我也不知道到底问题出在哪里。

如果在C#中勾选了“为COM互操作注册”一项的话,在DELPHI中Import a Type Library中就可以直接看到这一项:

这样生成的DELPHI文件是没问题的,可以正常运行。但是我在想,如果我要拿到别人的电脑上该如何注册呢?上面那些问题该怎么解决?

最后一个问题,在DELPHI中通过Import .NET Assembly加载DLL生成的pas文件中,比用上述Import a Type Library方式生成的pas文件多了很多内容,多生成了一个TMyFunc的类,而且这个类里增加了很多函数。

  1 // *********************************************************************//
2 // OLE Server Proxy class declaration
3 // Server Object : TMyFunc
4 // Help String :
5 // Default Interface: IMyFunc
6 // Def. Intf. DISP? : No
7 // Event Interface:
8 // TypeFlags : (2) CanCreate
9 // *********************************************************************//
10 TMyFunc = class(TOleServer)
11 private
12 FIntf: IMyFunc;
13 function GetDefaultInterface: IMyFunc;
14 protected
15 procedure InitServerData; override;
16 public
17 constructor Create(AOwner: TComponent); override;
18 destructor Destroy; override;
19 procedure Connect; override;
20 procedure ConnectTo(svrIntf: IMyFunc);
21 procedure Disconnect; override;
22 function Jia(a: Integer; b: Integer): Integer;
23 function Jian(a: Integer; b: Integer): Integer;
24 property DefaultInterface: IMyFunc read GetDefaultInterface;
25 published
26 end;
27
28 procedure Register;
29
30 resourcestring
31 dtlServerPage = '(none)';
32
33 dtlOcxPage = '(none)';
34
35 implementation
36
37 uses System.Win.ComObj;
38
39 class function CoMyFunc.Create: IMyFunc;
40 begin
41 Result := CreateComObject(CLASS_MyFunc) as IMyFunc;
42 end;
43
44 class function CoMyFunc.CreateRemote(const MachineName: string): IMyFunc;
45 begin
46 Result := CreateRemoteComObject(MachineName, CLASS_MyFunc) as IMyFunc;
47 end;
48
49 procedure TMyFunc.InitServerData;
50 const
51 CServerData: TServerData = (
52 ClassID: '{7F9DF1C0-61B0-3579-AD03-81BB0F9E7972}';
53 IntfIID: '{76EED873-51B7-3DFC-87BE-A88C77FD3E44}';
54 EventIID: '';
55 LicenseKey: nil;
56 Version: 500);
57 begin
58 ServerData := @CServerData;
59 end;
60
61 procedure TMyFunc.Connect;
62 var
63 punk: IUnknown;
64 begin
65 if FIntf = nil then
66 begin
67 punk := GetServer;
68 Fintf:= punk as IMyFunc;
69 end;
70 end;
71
72 procedure TMyFunc.ConnectTo(svrIntf: IMyFunc);
73 begin
74 Disconnect;
75 FIntf := svrIntf;
76 end;
77
78 procedure TMyFunc.DisConnect;
79 begin
80 if Fintf <> nil then
81 begin
82 FIntf := nil;
83 end;
84 end;
85
86 function TMyFunc.GetDefaultInterface: IMyFunc;
87 begin
88 if FIntf = nil then
89 Connect;
90 Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call "Connect" or "ConnectTo" before this operation');
91 Result := FIntf;
92 end;
93
94 constructor TMyFunc.Create(AOwner: TComponent);
95 begin
96 inherited Create(AOwner);
97 end;
98
99 destructor TMyFunc.Destroy;
100 begin
101 inherited Destroy;
102 end;
103
104 function TMyFunc.Jia(a: Integer; b: Integer): Integer;
105 begin
106 Result := DefaultInterface.Jia(a, b);
107 end;
108
109 function TMyFunc.Jian(a: Integer; b: Integer): Integer;
110 begin
111 Result := DefaultInterface.Jian(a, b);
112 end;
113
114 procedure Register;
115 begin
116 RegisterComponents(dtlServerPage, [TMyFunc]);
117 end;

因为对C#不太熟悉,所以出现了这么多问题,谁知道怎么做的麻烦告诉我。

正常的DELPHI代码:

 1 unit Unit1;
2
3 interface
4
5 uses
6 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
7 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons;
8
9 type
10 TForm1 = class(TForm)
11 btn1: TBitBtn;
12 mmo1: TMemo;
13 procedure btn1Click(Sender: TObject);
14 private
15 { Private declarations }
16 public
17 { Public declarations }
18 end;
19
20 var
21 Form1: TForm1;
22
23 implementation
24
25 uses
26 U8Service_TLB;
27
28 {$R *.dfm}
29
30 procedure TForm1.btn1Click(Sender: TObject);
31 var
32 C1: IMyFunc;
33 begin
34 C1 := CoMyFunc.Create;
35 mmo1.Lines.Add(IntToStr(C1.Jia(5, 7)));
36 end;
37
38 end.

C#.NET制作DLL供DELPHI调用的更多相关文章

  1. 用IKVMC将jar转成dll供c#调用

    用IKVMC将jar转成dll供c#调用 ikvmc c# dll jar 用IKVMC将jar转成dll供c#调用 前言 ikvmc介绍 ikvmc下载安装 下载并解压 设置环境变量 jar-> ...

  2. Go 程序编译成 DLL 供 C# 调用。

    Go 程序编译成 DLL 供 C# 调用. C# 结合 Golang 开发   1. 实现方式与语法形式 基本方式:将 Go 程序编译成 DLL 供 C# 调用. 1.1 Go代码 注意:代码中 ex ...

  3. Delphi编写DLL供C#调用的实例

    Delphi中编写的Dll: library TestDLL; { Important note about DLL memory management: ShareMem must be the f ...

  4. [笔记]Delphi 2007写DLL供VC调用实例

    考虑如下几种常用情况: - VC传入int,返回int- VC传入char *,返回int- VC传入char *,返回char *及int 为简化问题,传递的字符串参数只考虑ANSI格式,不考虑UN ...

  5. java生成jar并用ikvm生成dll供C#调用

    最近想尝试用C#做NB_IOT北向API接口的访问.北向API的接口的访问需要证书的双向认证,而C#不支持双向认证,所以就使用IKVM在C#中跑JAVA程序实现HTTPS请求部分. 步骤如下: 一.使 ...

  6. Matlab函数编译成dll供c调用

    一 编译dll 在Command Window窗口中输入mbuild -setup,然后会出现语句,是否安装编译器,选择n,因为机子上已经安装了C/C++/C#的编译器,选择VS2010.

  7. CommMonitor8.0 串口过滤驱动 SDK DLL版本 C#/Delphi调用DEMO

    CommMonitor8.0 SDK DLL 版本,此版本是直接调用DLL. Delphi调用定义: constCommMOnitor8x = ‘CommMOnitor8x.dll’; typeTOn ...

  8. Delphi调用C++导出的QT类

    打开VS2008创建一个dll项目(创建了一个QT Library项目),新建头文件q4dapplication.h定义纯虚类: #ifndef Q4DAPPLICATION#define Q4DAP ...

  9. delphi dll创建及调用

    第一章 DLL简单介绍由于在目前的学习工作中,需要用到DLL文件,就学习了下,在这里作个总结.首先装简单介绍下DLL:1,减小可执行文件的大小DLL技术的产生有很大一部分原因是为了减小可执行文件的大小 ...

  10. Delphi制作DLL

    一.开使你的第一个DLL专案 1.File->Close all->File->New﹝DLL﹞ 代码: //自动产生Code如下 library Project2; //这有段废话 ...

随机推荐

  1. 我的Vue之旅(4)

    2020-10-26 使用v-bind来绑定class属性主要是分成了两类,即对象语法与数组语法,其实在数组中也是可以混用对象语法的,但在Demo3中我没有 写出来,有兴趣的话可以自己试试.在HTML ...

  2. Kubernetes控制器-Horizontal Pod Autoscaler(HPA)

    Horizontal Pod Autoscaler(HPA) 我们可以通过手动执行kubeclt sacle命令实现Pod的扩缩容,但是这显然不符合Kubernetes的定位目标-自动化和智能化.Ku ...

  3. Android studio虚拟机黑屏

    1.冷启动 cold boot now 2.新建一个 另外今天下午起来的比较晚,就在宿舍上的机,然后效果就比较差,我有罪,我下次要学习一定不在宿舍,今晚也是早早的吃了饭就来自习了,这就是成果.卡了我一 ...

  4. K8s新手系列之CronJob

    概述 官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/cron-jobs/ CronJob控制器以 Job控制 ...

  5. Windows11 关闭搜索栏中的Web网页搜索

    ️ Win11 搜索栏总弹出网页搜索通过注册表彻底关闭 在 Windows 11 系统中,当你通过任务栏中的搜索栏查找内容时,除了显示本地文件.应用和设置外,系统还会自动集成 Bing 搜索结果,展示 ...

  6. 如何基于three.js(webgl)引擎架构,实现3D机房园区,数据中心消防系统

    前言前面的文章我们已经详细介绍了数据中心机房的关键知识点,以及消防领域的基础知识.在此基础上,本文将深入探讨展示消防在数据中心这一特殊场景中的应用,特别是气体消防系统的应用模拟及发生火灾时逃生路径规划 ...

  7. 在.Net Core类库中引入System.Windows.Forms,报错问题

    https://blog.rayfalling.com/2020/04/%e5%9c%a8-net-core%e4%b8%ad%e5%bc%95%e5%85%a5system-windows-form ...

  8. 图片生成对嘴视频FLOAT

    之前已经介绍过图片对嘴生成视频的开源工具: DICE-Talk:https://www.cnblogs.com/cj8988/p/18957718   (带表情,比较慢) ComfyUI_Sonic: ...

  9. robots.txt 简单解析

    简介 robots.txt 是一个规范,对于执行正常操作的爬虫理应遵守的规范. 例子 博客园例子 https://www.cnblogs.com/robots.txt User-Agent: * Al ...

  10. vue 引用echarts控件进行数据可视化显示

    最近公司在项目的开发中引入echarts,运行时发现有些问题 在使用echarts的时候,下载按钮显示数据不全 代码如下: toolbox: { feature: { saveAsImage: {} ...