【问题标题】:GetProcAddress() returns Nil for a .NET DLLGetProcAddress() 为 .NET DLL 返回 Nil
【发布时间】: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。

标签: c# .net delphi com delphi-6


【解决方案1】:

使用Delphi调用.NET DLL,你可以这样尝试:

var 
  OBJ: Variant;
begin 
   try 
      OBJ := CreateOleObject('DLLName.UnManClass');
      ShowMessage(IntToStr(OBJ.DLL_Version));
   finally
      OBJ := Unassigned;
   end;
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多