DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: monica9612
今日帖子: 0
在线用户: 4
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
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需要特殊设置或者我在生成的时候步骤是有问题的?
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 chinaz (有缘人) ★☆☆☆☆ -
神秘会员
2019/6/11 10:45:40
1楼: 你如果用于商业,建议用DotNetRuntimeLibrary4Delphi,这个不用com也可以,很好用,他会生成一个delphi的接口文件,直接调用即可。
----------------------------------------------
一路风雨走过,因为有你们
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2019/6/11 10:51:55
2楼: 谢谢 chinaz,我就自个儿用,不知道哪里能求得和谐版?
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2019/6/11 11:40:32
3楼: 干吗不用 COM ?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2019/6/11 11:40:48
4楼: COM 多好,微软的新 API 全是 COM。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2019/6/11 12:15:45
5楼: DotNetRuntimeLibrary4Delphi,CrossTalk,RemObjects Hydra.....
----------------------------------------------
-
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2019/6/12 0:38:31
6楼: @crystalmoon,谢谢,
我需要的是Delphi调用C#写的DLl
DotNetRuntimeLibrary4Delphi完全找不到,这个应该是我需要的
RemObjects Hydra.找到个5的版本,但是不知道如何使用,
CrossTalk也是找不到

所以DotNetRuntimeLibrary4Delphi在哪里才能找得到啊
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 chinaz (有缘人) ★☆☆☆☆ -
神秘会员
2019/6/12 5:47:22
7楼: 花钱,才几百一千多块,支持正版,不要光想这盗版,这样会害了你的。
----------------------------------------------
一路风雨走过,因为有你们
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2019/6/12 8:47:17
8楼: 非商业用途,就自己用用,
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 wangyunyong (新秀) ★☆☆☆☆ -
盒子活跃会员
2019/6/12 9:34:55
9楼: https://sourceforge.net/projects/dotnetruntimelibraryfordelphi/
----------------------------------------------
-
作者:
男 toupiao (wwww) ★☆☆☆☆ -
普通会员
2019/6/12 9:51:03
10楼: https://sourceforge.net/projects/dotnetruntimelibraryfordelphi/
这个有试用期
----------------------------------------------
-
作者:
男 hzw008 (新心晨曦) ★☆☆☆☆ -
盒子活跃会员
2019/6/12 10:48:55
11楼: https://www.crystalnet-tech.com/?tdsourcetag=s_pcqq_aiomsg
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2019/6/12 11:37:52
12楼: C#的DLL是自己写的么? 如果不是自己写的就只能用上述的办法试试了。如果是自己写的。就是缺接口定义。


1.在实现类的前面加[ClassInterface(ClassInterfaceType.AutoDispatch)]
2.定义一个你要发布的方法的接口,在实现类中引用接口,接口上要定义接口自己的GUID和[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
然后每个方法前加[DispId(X)],X是一个数字。不同方法的X不能一样。



这样才能被Delphi 导入类型库时,看见方法。 方法在接口下面,根据Co类名那个类返回接口,就可以调用方法了。
----------------------------------------------
-
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2019/6/12 15:38:19
13楼: C#的DLL是别人写的,要推动的估计比较难,所以才想着是否可以用插件的方式,就是找不到那个DotNetRuntimeLibrary4Delphi
----------------------------------------------
只会简单使用,并未精通深入
作者:
女 sinagirl (雪亮) ★☆☆☆☆ -
盒子活跃会员
2019/6/12 16:02:58
14楼: 用jvcl可以调用
----------------------------------------------
健康快乐每一天
作者:
男 qingyun (qingyun) ★☆☆☆☆ -
盒子活跃会员
2019/9/4 20:34:02
15楼: 我之前用的这个方法:
 http://www.csframework.com/archive/2/arc-2-20110408-1307.htm

关键就是要生成一个注册表文件;

到不同电脑上,都要把这个注册表导入一下才能用;
有点类似于以前注册 ocx;

不过调用倒是挺简单的,直接 用varint类型,
任意写名字调用(就是注册表里的函数名)

我在想,如果能够动态字符串调用就好了,这样可以做成配置的了;
----------------------------------------------
青云论坛
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2019/9/5 10:23:44
16楼: https://blog.csdn.net/cgh_chen/article/details/6367748
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2019/9/5 10:27:46
17楼: 示例代码:
https://github.com/acj1971/DelphiDotNETInteropJVCLExamples
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 qingyun (qingyun) ★☆☆☆☆ -
盒子活跃会员
2019/9/7 9:34:37
18楼: to letianwuji (乐天无极):
  多谢提供,可能 最新的jvcl,在delphi10.3里,我还没搞定;
我在找找高版本的;
----------------------------------------------
青云论坛
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2019/9/7 10:59:14
19楼: 自己修改修改,我安装的是10.2...没安装10.3.
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 zyp1984 (小李他妈的飞刀) ★☆☆☆☆ -
普通会员
2019/9/7 21:31:14
20楼: 微软的玩意儿的确很方便。有源码直接按com进行编译,随便用。。。
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
作者:
男 qingyun (qingyun) ★☆☆☆☆ -
盒子活跃会员
2019/9/16 22:55:54
21楼: 这个比较全:

https://www.crystalnet-tech.com/RuntimeLibrary/Download
----------------------------------------------
青云论坛
作者:
男 ke8880 (ke8880) ★☆☆☆☆ -
普通会员
2019/9/17 10:32:50
22楼: JVCL组件能实现Delphi调用C#的DLL??
----------------------------------------------
-
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2020/3/30 1:42:45
23楼: 10.3 刚前几天安装了下,能jcl调用c#写的函数返回值。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 zgc123 (zgc123) ★☆☆☆☆ -
盒子活跃会员
2020/3/30 18:49:07
24楼: 我用c#写的Com dll,要注册成Tlb文件,然后在vb中调用通过。
----------------------------------------------
欢迎访问我的网站:http://zhenggc.cc/http://zhenggc.com
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2020/3/30 19:01:45
25楼: 楼上,你没看到重点...jcl调用c#写的dll模块,不需要注册tlb操作...起码,不用命令去注册。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 zhouxz8848 (二二) ★☆☆☆☆ -
普通会员
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.
成功了。谢谢乐天无极
----------------------------------------------
-
作者:
男 zyp1984 (小李他妈的飞刀) ★☆☆☆☆ -
普通会员
2021/1/7 9:49:37
27楼: 正经的硬件厂商都会用C++ 提供动态库。如果用C#提供的都是不咋专业的,IC 卡读取应该是标准协议。
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
作者:
男 zhouxz8848 (二二) ★☆☆☆☆ -
普通会员
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#命令
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行754.8828毫秒 RSS