将Delphi Dll导入我的Vb.net项目
我试图将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(
这是我的代码:
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;出口看在上帝的份上,使用调试工具。信息是明确的。没有该名称的导出。在Dependency Walker中加载DLL。查看导出了哪些函数。查看为什么您的DLL不是/您正在创建库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
部分,它也会执行相同的操作。@事实上,两个答案中的代码与问题中的代码没有真正的区别。