Delphi + . net dll部署(在另一台pc上)
本文关键字:一台 pc net dll 部署 Delphi | 更新日期: 2023-09-27 18:16:31
我开发的Delphi应用程序使用。net dll(用c#编写),使用另一个。net dll(可能是c#)。我把它们命名为A.dll和B.dll。
我有A.dll的源代码,但不是B.dll。我不能从Delphi应用程序中使用B.dll,因为B.dll仅为c#应用程序编写(即没有COM互操作),所以我使用我的A.dll与B.dll一起工作。
B.dll创建2个管道与A.dll交换消息。问题是B.dll不能(!)连接到不同计算机上的这些管道。然而,如果我创建A.exe而不是A.dll,一切都是绝对ok的(管道连接和整个消息交换过程是ok的)。在我的PC上,我总是构建A.dll和Delphi应用程序。我如何理解Visual Studio自动使用命令1) regasm -注册a.l ll;2) tlbexp -获取A.tlb文件。
之后,我通过"导入类型库命令"导入A.tlb到Delphi应用程序。
在另一台计算机上,这里是A.dll过程管道从未连接的问题(我使用日志来理解这一点)。这里所说的"从未连接"是指无限等待pipe.WaitForConnection()命令的结果(在c#中)。
有谁能帮我解决这个问题吗?为什么"A.exe"可以用于Delphi应用程序,而不是"A.dll"?谢谢
我调查过这个问题。首先,在其他dll内部使用dll是坏主意。根据许多文章,GetProcAddr和其他一些函数可能会出现问题。其次,我开发了c#应用程序来与B.dll和Delphi应用程序进行通信。此外,我使用管道来实现这一点。
在Delphi中使用托管代码最简单的方法是通过COM,但是您不喜欢这种方法。
如果你的DLL目标是。net Framework 4。然后你可以使用DllExport
如果您正在开发针对。net Core或。net Standard的DLL,我建议您阅读这篇文章:https://learn.microsoft.com/en-us/dotnet/core/tutorials/netcore-hosting
3种方法我都试过了,都有效。另一个来自github的解决方案:不使用COM在运行时调用。net dll
DDNRuntime(Delphi . net Framework/。. NET Core Runtime)
https://github.com/ying32/DDNRuntime-examples它可以帮助你轻松调用。net函数
一样function CreateMainForm(): DNForm;
var
LButton: DNButton;
LR: DNRectangle;
//LEdit: DNTextBox;
begin
LR := TDNScreen.DNClass.PrimaryScreen.Bounds;
Result := TDNForm.Create;
Result.Text := 'Delphi .NET Runtime';
LButton := TDNButton.Create;
LButton.Text := 'Hello';
LButton.add_Click(TEventClass.OnButtonClick);
LButton.Location := TDNPoint.DNClass.init(100, 100);
Result.Controls.Add(LButton);
//Result.StartPosition := DNFormStartPosition.Manual;
Result.StartPosition := DNFormStartPosition.CenterScreen;
//Result.Location := TDNPoint.DNClass.init((LR.Width - Result.Width) div 2, (LR.Height - Result.Height) div 2);
end;