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

为啥 GetProcAddress() 不起作用?

在 C++ 中转换 GetProcAddress 返回的指针

有没有办法找到要在 GetProcAddress 中使用的 C++ 错位名称?

我应该使用 GetProcAddress 还是只包含各种 win32 库?