首页 新闻 会员 周边

.net4引用Delph动态DLL库

0
悬赏园豆:5 [待解决问题]

vs2017、net4、无法引用?
报错:请确保此文件可访问并且是一个有效的程序集或com组件

是Delph动态链接库的问题吗?
也把dll放bin同目录底下啦
请有经验的大佬指点一手

谦谦君子秋风扫落叶的主页 谦谦君子秋风扫落叶 | 初学一级 | 园豆:199
提问于:2023-06-12 00:02
< >
分享
所有回答(4)
0

确保你的 DLL 文件已注册到系统中。如果没有注册,你可以使用 regsvr32 命令将其注册到系统中。在命令行窗口中执行以下命令:regsvr32 "path_to_dll_file",其中 "path_to_dll_file" 是指向 Delphi DLL 文件的完整路径和文件名。
如果以上没有解决问题,你可以尝试使用 Dependency Walker 工具来检查 DLL 文件中是否存在依赖关系错误。如果依赖项缺失或无法找到,这也会导致无法正确调用 DLL 函数。

lanedm | 园豆:2378 (老鸟四级) | 2023-06-12 08:29
0

一、Delphi7=>File=>New=>Other=>DLL Wizard,然后输入以下代码:

复制代码
library dllres;

uses
SysUtils, Classes,Dialogs;

{$R *.res}

function Plus(x, y: integer): Integer; stdcall;
begin
Result:= x + y;
end;

procedure Hello( a, b:WideString; out return : WideString) ;stdcall
begin
return:= a+ b;
end;

exports
Plus,Hello;
begin
end.
复制代码
按Ctrl+F9生成dll

二、C# 中新建Winform程序,设置目标框架为x86

1、把Delphi生成的dll复制到C#的exe文件夹下

2、在C# 中添加如下代码:

复制代码
/// <summary>
/// C# 调用Delphi Dll的样例
/// </summary>
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

        //调用求和的方法
        int a = Plus(1, 2);

        string ip = "ABCDEF老天____";
        string workOrder = "REA22C100A";

        //调用返回字符串的方法
        string result;
        Hello(ip, workOrder, out result);

        //为了设置个断点,多写下面这句代码
        int x = 2;
    }

    /// <summary>
    /// 引入Delphi的求和方法
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    [DllImport(@"dllres.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    public static extern int Plus(int x, int y);

    /// <summary>
    /// 引入Delphi的返回字符串的方法
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <param name="result"></param>
    [DllImport(@"dllres.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    public static extern void Hello(
        [MarshalAs(UnmanagedType.BStr)]string a,
        [MarshalAs(UnmanagedType.BStr)]string b,
        [MarshalAs(UnmanagedType.BStr)]out string result);

}

复制代码

参考文献:
https://www.appsloveworld.com/csharp/100/154/using-delphi-dll-in-c
https://www.cnblogs.com/nirvanan/articles/16992861.html

Tom.汤 | 园豆:3028 (老鸟四级) | 2023-06-12 14:08
0

首先确认delph的dll是com组建还是直接导出api的非com组建;
确认方式:使用depends查看导出的api
如果是com组建,看是否已经注册到系统;
如果是纯api,可以用dllimport使用api

Zzx飘遥 | 园豆:207 (菜鸟二级) | 2023-06-12 22:10
0

如果您想在.NET Framework 4中引用一个Delphi动态链接库(DLL),您需要确保该DLL是.NET兼容的,并且包含可以在.NET项目中使用的公共类型或COM组件。

如果您无法成功引用该DLL,并且收到"请确保此文件可访问并且是一个有效的程序集或COM组件"的错误消息,可能有以下几个原因:

DLL不是.NET兼容的:确保该DLL是使用Delphi编译为.NET程序集,并且符合.NET的规范。如果DLL是使用非托管代码编译的,您将无法直接在.NET项目中引用它。

DLL文件不可访问:确保DLL文件的路径是正确的,并且您具有足够的权限来访问该文件。有时,文件路径中包含特殊字符或空格可能导致访问问题。

DLL文件损坏或缺少依赖项:确保DLL文件没有损坏,并且它的依赖项已正确安装。您可以使用依赖项查看器(Dependency Walker)等工具来检查DLL的依赖项。

如果您确定DLL是.NET兼容的,并且文件可访问且没有损坏或缺少依赖项,但仍无法引用它,请尝试以下解决方案:

使用Interop技术:如果该DLL是一个非托管的COM组件,您可以使用Interop技术(COM互操作性)来在.NET项目中引用它。在Visual Studio中,您可以使用“添加引用”对话框中的“COM”选项来添加该DLL作为COM组件。

手动注册DLL:如果DLL是一个COM组件,您可能需要手动注册它。您可以使用Regsvr32命令行工具来注册COM组件。

请注意,以上只是一些常见的解决方案,具体取决于您的DLL和项目的特定情况。如果问题仍然存在,建议查阅DLL的文档或联系DLL的提供者以获取更详细的支持。

Technologyforgood | 园豆:5686 (大侠五级) | 2023-06-12 23:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册