因为工作需求,本来想用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.
标签:begin,end,C#,DELPHI,DLL,procedure,Integer,TMyFunc,IMyFunc From: https://www.cnblogs.com/kenlewis/p/17045352.html