GetProcAddress() 为 .NET DLL 返回 Nil
Posted
技术标签:
【中文标题】GetProcAddress() 为 .NET DLL 返回 Nil【英文标题】:GetProcAddress() returns Nil for a .NET DLL 【发布时间】:2021-07-17 18:05:55 【问题描述】:我正在尝试从 Delphi 6 调用 .NET DLL。
使用LoadLibrary()
动态加载DLL工作正常,并返回句柄。
Handle := LoadLibrary(PChar(DLLName));
但是,GetProcAddress()
函数正在返回 nil
,即使 Handle
是有效的,并且函数 'DLL_Version' 存在。
GetProcAddress(Handle, 'DLL_Version');
DLL代码贴在下面
[Guid("14fd1190-df04-488c-ab0f-b120ea3e3f3a")]
[ComVisible(true)]
public class UnManClass
[DllExport]
public static int DLL_Version()
return 251;
我已经使用UnmanagedExports nuget 包来支持 C# 中的 [DllExport]。
这是 DumpBin 的输出:
有什么方法可以解决这个问题,或者有什么替代方法可以解决吗?
【问题讨论】:
怎么知道DLL导出了DLL_Version
函数?
当GetProcAddress()
失败时,使用GetLastError()
找出原因。但最常见的原因是因为请求的函数不存在。仔细检查,例如使用TDUMP 之类的工具。确保函数实际上已导出,并且使用您所期望的精确拼写 导出。实现和导出功能的 .NET 代码是什么样的?
也许您需要从 C# 例程中删除 static
关键字。
@R.Hoek 不,看看example。
在 LoadLibrary 中,使用 DLL 的完整路径以确保加载正确的 DLL。确保 LoadLibrary 不返回 0。
【参考方案1】:
使用Delphi调用.NET DLL,你可以这样尝试:
var
OBJ: Variant;
begin
try
OBJ := CreateOleObject('DLLName.UnManClass');
ShowMessage(IntToStr(OBJ.DLL_Version));
finally
OBJ := Unassigned;
end;
end
【讨论】:
以上是关于GetProcAddress() 为 .NET DLL 返回 Nil的主要内容,如果未能解决你的问题,请参考以下文章
解析Delphi中的LoadLibrary,GetProcAddress,FreeLibrary
解决办法一:GetProcAddress函数返回值总为NULL
在 C++ 中转换 GetProcAddress 返回的指针