Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Delphi Dll导入我的Vb.net项目_Vb.net_Delphi_Interop - Fatal编程技术网

将Delphi Dll导入我的Vb.net项目

将Delphi Dll导入我的Vb.net项目,vb.net,delphi,interop,Vb.net,Delphi,Interop,我试图将delphi dll导入我的vb.net项目 这是我的代码: Private Declare Function AddIntegers Lib "C:\Program Files (x86)\Borland\Delphi6\Projects\first dll\Project2.dll" Alias "AddIntegers" (ByVal a As Integer, ByVal b As Integer) As Integer Private Sub Form1_Load(

我试图将delphi dll导入我的vb.net项目

这是我的代码:

Private Declare Function AddIntegers Lib "C:\Program Files (x86)\Borland\Delphi6\Projects\first dll\Project2.dll" Alias "AddIntegers" (ByVal a As Integer, ByVal b As Integer) As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim ii As Integer = AddIntegers(1, 3)
        MsgBox(ii)
    End Sub
这是delphi库代码:

library MyFirstLibrary;

uses
  SysUtils,
  Classes;

{$R *.res}

function AddIntegers(_a, _b: integer): integer; stdcall;
begin
  Result := _a + _b;
end;

exports
   AddIntegers;
begin
end.
存在EntryPointNotFoundException:

Unable to find an entry point named 'AddIntegers' in DLL 'C:\Program Files (x86)\Borland\Delphi6\Projects\first dll\Project2.dll'.":""
如何修复EntryPointNotFoundException(函数AddIntegers存在于我的delphi代码中)?
(vb.net或c#)

我猜您正在加载另一个库。您正在加载
Project2.dll
,而您的Delphi库在您在问题中发布的代码中被称为
MyFirstLibrary.dll

尝试直接使用
DllImport
并应用不同的调用约定修饰符:

<DllImport("C:\Program Files (x86)\Borland\Delphi6\Projects\first dll\Project2.dll", CallingConvention:=CallingConvention.StdCall)> _
Private Shared Function AddIntegers(ByVal a As Integer, ByVal b As Integer) As Integer
_
专用共享函数加法器(ByVal a为整数,ByVal b为整数)为整数

那么,你不认为回答自己的问题、接受答案并将答案留给遇到同样问题的用户是有意义的吗?我当时没有考虑,从错误中学习似乎是问题所在。试着这样写:
函数AddIntegers(_a,_b:integer):integer;出口库MyFirstLibrary
(使用
{$R*.res}
),但您的输出DLL是
Project2.DLL
?不是
MyFirstLibrary.dll
?这甚至可以编译吗?我怀疑这不是你真正的密码。我建议您重新开始一个新项目,在一个新的目录中(不要使用硬编码路径)。这真的太本地化了@Burgos,
export
在32位DLL中无效。相同结果(EntryPointNotFoundException)请参阅更新。我认为你正在加载一个不同的库。但无论如何,这样硬编码路径是个坏主意。你必须使用不同的库。一些,它有一个不同的导出函数,您试图在这里导入。尝试使用您拥有的代码创建一个全新的Delphi库,用一个新的(唯一的)名称保存该Delphi项目,构建它,并使用确切的路径将该全新库的路径输入到
子句中。此答案中的代码似乎毫无意义。很明显,实际问题是VB代码加载的库与问题中的代码不同。托管代码中指定的DLL名称与本机代码中指定的
名称之间存在明显的不匹配。无论您是使用
Declare
还是
DllImport
。这根本不是问题,我不想写答案。答案就是你的第一段。这就是所需要的。所以我投了更高的票。代码只是稀释了信息。你使用了错误的呼叫约定,不是吗?这里OP使用了
stdcall
…这仍然是错误的。您明确表示要使用
Cdecl
。我已将其更改为stdcall-抱歉!但是,根据MSDN,这应该是Windows系统的默认设置。。我开始认为DLL入口点中可能有前缀或类似的东西-否则,它应该可以工作。这更好,但现在我们的答案之间的唯一区别是,您已经硬编码了库的路径,而我希望它对程序集可见。P/Invoke的默认调用约定是
stdcall
,因此即使省略
CallingConvention
部分,它也会执行相同的操作。@事实上,两个答案中的代码与问题中的代码没有真正的区别。