|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2019/6/11 10:32:10 |
标题: |
Delphi 如何调用C#写的DLL |
浏览:3303 |
|
加入我的收藏 |
楼主: |
看过一些文章,说是C#写的DLL必须设置“使程序集COM可见”这样的方式,才能被调用,然后又说使用regasm先注册这个DLL,后有两种方式调用, 第一种是仿照调用Excel的方式, var aClass: Variant; begin aClass:= CreateOleObject('TestDll.TestClass'); aClass.YourProcedure ('参数'); end; 这种方法,我测试过时成功的,但是看不到接口 第二种是根据生成tlb文件,在project菜单选择import type library——>Add 这个tlb文件,会生成unit TestDelphi_TLB, 这种方式能在TestDelphi_TLB看到接口,但是我生成了,却看不到任何接口方法, 请教是否是C#写的DLL需要特殊设置或者我在生成的时候步骤是有问题的?
----------------------------------------------
只会简单使用,并未精通深入 |
作者: |
|
2019/6/11 10:45:40 |
1楼: |
你如果用于商业,建议用DotNetRuntimeLibrary4Delphi,这个不用com也可以,很好用,他会生成一个delphi的接口文件,直接调用即可。
----------------------------------------------
一路风雨走过,因为有你们
|
作者: |
|
2019/6/11 10:51:55 |
2楼: |
谢谢 chinaz,我就自个儿用,不知道哪里能求得和谐版?
----------------------------------------------
只会简单使用,并未精通深入
|
作者: |
|
2019/6/11 11:40:32 |
3楼: |
干吗不用 COM ?
----------------------------------------------
(C)(P)Flying Wang
|
作者: |
|
2019/6/11 11:40:48 |
4楼: |
COM 多好,微软的新 API 全是 COM。
----------------------------------------------
(C)(P)Flying Wang
|
作者: |
|
2019/6/11 12:15:45 |
5楼: |
DotNetRuntimeLibrary4Delphi,CrossTalk,RemObjects Hydra.....
----------------------------------------------
-
|
作者: |
|
2019/6/12 0:38:31 |
6楼: |
@crystalmoon,谢谢, 我需要的是Delphi调用C#写的DLl DotNetRuntimeLibrary4Delphi完全找不到,这个应该是我需要的 RemObjects Hydra.找到个5的版本,但是不知道如何使用, CrossTalk也是找不到
所以DotNetRuntimeLibrary4Delphi在哪里才能找得到啊
----------------------------------------------
只会简单使用,并未精通深入
|
作者: |
|
2019/6/12 5:47:22 |
7楼: |
花钱,才几百一千多块,支持正版,不要光想这盗版,这样会害了你的。
----------------------------------------------
一路风雨走过,因为有你们
|
作者: |
|
2019/6/12 8:47:17 |
8楼: |
非商业用途,就自己用用,
----------------------------------------------
只会简单使用,并未精通深入
|
作者: |
|
2019/6/12 9:34:55 |
9楼: |
https://sourceforge.net/projects/dotnetruntimelibraryfordelphi/
----------------------------------------------
-
|
作者: |
|
2019/6/12 9:51:03 |
10楼: |
https://sourceforge.net/projects/dotnetruntimelibraryfordelphi/ 这个有试用期
----------------------------------------------
-
|
作者: |
|
2019/6/12 10:48:55 |
11楼: |
https://www.crystalnet-tech.com/?tdsourcetag=s_pcqq_aiomsg
----------------------------------------------
-
|
作者: |
|
2019/6/12 11:37:52 |
12楼: |
C#的DLL是自己写的么? 如果不是自己写的就只能用上述的办法试试了。如果是自己写的。就是缺接口定义。
1.在实现类的前面加[ClassInterface(ClassInterfaceType.AutoDispatch)] 2.定义一个你要发布的方法的接口,在实现类中引用接口,接口上要定义接口自己的GUID和[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] 然后每个方法前加[DispId(X)],X是一个数字。不同方法的X不能一样。
这样才能被Delphi 导入类型库时,看见方法。 方法在接口下面,根据Co类名那个类返回接口,就可以调用方法了。
----------------------------------------------
-
|
作者: |
|
2019/6/12 15:38:19 |
13楼: |
C#的DLL是别人写的,要推动的估计比较难,所以才想着是否可以用插件的方式,就是找不到那个DotNetRuntimeLibrary4Delphi
----------------------------------------------
只会简单使用,并未精通深入
|
作者: |
|
2019/6/12 16:02:58 |
14楼: |
用jvcl可以调用
----------------------------------------------
健康快乐每一天
|
作者: |
|
2019/9/4 20:34:02 |
15楼: |
我之前用的这个方法: http://www.csframework.com/archive/2/arc-2-20110408-1307.htm
关键就是要生成一个注册表文件;
到不同电脑上,都要把这个注册表导入一下才能用; 有点类似于以前注册 ocx;
不过调用倒是挺简单的,直接 用varint类型, 任意写名字调用(就是注册表里的函数名)
我在想,如果能够动态字符串调用就好了,这样可以做成配置的了;
----------------------------------------------
青云论坛
|
作者: |
|
2019/9/5 10:23:44 |
16楼: |
https://blog.csdn.net/cgh_chen/article/details/6367748
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
|
作者: |
|
2019/9/7 9:34:37 |
18楼: |
to letianwuji (乐天无极): 多谢提供,可能 最新的jvcl,在delphi10.3里,我还没搞定; 我在找找高版本的;
----------------------------------------------
青云论坛
|
作者: |
|
2019/9/7 10:59:14 |
19楼: |
自己修改修改,我安装的是10.2...没安装10.3.
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
|
作者: |
|
2019/9/7 21:31:14 |
20楼: |
微软的玩意儿的确很方便。有源码直接按com进行编译,随便用。。。
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
|
作者: |
|
2019/9/17 10:32:50 |
22楼: |
JVCL组件能实现Delphi调用C#的DLL??
----------------------------------------------
-
|
作者: |
|
2020/3/30 1:42:45 |
23楼: |
10.3 刚前几天安装了下,能jcl调用c#写的函数返回值。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
|
作者: |
|
2020/3/30 19:01:45 |
25楼: |
楼上,你没看到重点...jcl调用c#写的dll模块,不需要注册tlb操作...起码,不用命令去注册。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
|
作者: |
|
2021/1/6 15:35:25 |
26楼: |
unit Main;
interface
uses mscorlib_TLB, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, JclDotNet;
type TfrmMain = class(TForm) Button1: TButton; EditX: TEdit; EditY: TEdit; EditResult: TEdit; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } FClrHost: TJclClrHost; function AddFunction(aXValue: Integer; aYValue:Integer): Integer; public { Public declarations } end;
var frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.Button1Click(Sender: TObject); begin EditResult.text := IntToStr(AddFunction(StrToInt(EditX.text), StrtoInt(EditY.text))); end;
procedure TfrmMain.FormCreate(Sender: TObject); begin FClrHost := TJclClrHost.Create('v4.0.30319'); FClrHost.Start; end;
procedure TfrmMain.FormDestroy(Sender: TObject); begin FClrHost.Stop(); FClrHost.Free; end;
function TfrmMain.AddFunction(aXValue: Integer; aYValue:Integer): Integer; var Fads: TJclClrAppDomainSetup; Fad: TJclClrAppDomain; Ov: OleVariant; obj: _ObjectHandle; begin try Fads := FClrhost.CreateDomainSetup;
Fads.ApplicationBase := '..\Example2\Debug\Win32\';
Fad := FClrHost.CreateAppDomain('myNET', Fads);
obj := (Fad as _AppDomain).CreateInstanceFrom('Example2ClassLibrary.dll', 'Example2ClassLibrary.Example2'); ov := obj.Unwrap;
result := ov.AddFunction(aXValue, aYValue);
except on E : Exception do begin ShowMessage('Exception class name = '+E.ClassName + ' ' + 'Exception message = '+E.Message);
end; end; end;
end. 成功了。谢谢乐天无极
----------------------------------------------
-
|
作者: |
|
2021/1/7 9:49:37 |
27楼: |
正经的硬件厂商都会用C++ 提供动态库。如果用C#提供的都是不咋专业的,IC 卡读取应该是标准协议。
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
|
作者: |
|
2021/1/7 10:43:57 |
28楼: |
using System; using System.Collections; using System.Threading;
public byte GetAllTagsNum(out int TagCount, out string[] TagNumber) { TagCount = 0; TagNumber = new string[0]; if (!IsOpen) { return SerialPortErr; } byte value = SendAFrame(241, new byte[1] { 2 }); if (value != AllDone) { return value; } Thread.Sleep(100); ArrayList ar = new ArrayList(); byte ReturnFrameNum = 0; byte StateCode = 0; int DataLength = 0; byte[] FrameData = new byte[1]; value = RcvAFrame(ref ReturnFrameNum, ref StateCode, ref DataLength, ref FrameData); if (value != AllDone) { return value; } if (StateCode != 0) { return GetAllTagsNumErr; } if (DataLength == 0) { return GetAllTagsNumErr; } if (FrameData[0] != 0) { return GetAllTagsNumErr; } try { TagCount = DataLength / 10; for (int k = 0; k < TagCount; k++) { string tagnumber = ""; for (int j = 0; j < 8; j++) { tagnumber += FrameData[(k + 1) * 10 - j - 1].ToString("X2"); } if (ar.IndexOf(tagnumber) < 0) { ar.Add(tagnumber); } } } catch (Exception) { return GetAllTagsNumErr; } TagCount = ar.Count; TagNumber = new string[TagCount]; for (int k = 0; k < TagCount; k++) { TagNumber[k] = (string)ar[k]; } return AllDone; }
我要调用C#里的这个GetAllTagsNum, GetAllTagsNum(out int TagCount, out string[] TagNumber) TagCount, TagNumber在DLL里都是引用参数,返回值。 在DELPHI 里用@tagcount 提示type not allowed in variant dispatch call 请教大师delphi 如何转换这个C#命令
----------------------------------------------
-
|
|