捕获C#中从Delphi DLL引发的异常

Blaatz0r

我最近遇到的问题如下。

我有一个用Delphi编写的.DLL,该DLL具有功能Divide(该函数接受两个整数作为参数)并按原样返回其值。

function Divide( aFirstValue, aSecondValue : Integer ) : Double; stdcall;
begin
  result := aFirstValue / aSecondValue;
end;

现在,如果我使用以下参数“ 5、0”,那么它将引发DivideByZeroException(这是正确的:))

但是,当我从C#调用相同的.DLL时,它根本不会捕获任何异常。

[DllImport("DelphiDLL.DLL", EntryPoint = "Divide", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern float Divide(Int32 a, Int32 b);

private void Button_Click_2(object sender, System.EventArgs e)
{
    try
    {
       TB.Text += "Divide(a,b) = ";
       float temp;
       temp = Divide(Convert.ToInt32(aTB.Text), Convert.ToInt32(bTB.Text));

       Console.WriteLine(Marshal.GetLastWin32Error());

       TB.Text += Convert.ToString(temp) + "\r\n";
    }
    catch (DivideByZeroException eMsg)
    {

    }
}
戴维·赫弗南

您不能希望在DLL之外捕获该异常。这种二进制互操作形式的规则之一是,不能跨模块边界引发异常。

解决方法是修复DLL。在DLL中捕获异常并返回错误代码以指示失败。实际上,您应该保护所有入口点,以免引发异常。不要只捕获零除异常,捕获所有异常并将它们转换为错误代码返回值。

function CalcQuotient(a, b: Integer; out quotient: Double): Integer; stdcall;
begin
  try
    quotient := a / b;
    Result := 0;// you'd use a constant with a sensible name rather than a magic value
  except
    on E: Exception do begin
      Result := GetErrorCode(E);
      // where GetErrorCode is your function that converts exceptions into error codes
    end;
  end;
end;

有关p / invoke用法的一些帮助:

  1. 无需指定CharSet何时所有参数都不包含文本。
  2. SetLastError = true不正确,应将其删除。该函数不会调用SetLastError因此,对的调用Marshal.GetLastWin32Error()是错误的,应删除。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C Dll导入在C#中引发Marshall指令异常

来自分类Dev

捕获任务中引发的异常?

来自分类Dev

捕获异常并引发相同?

来自分类Dev

未引发捕获异常

来自分类Dev

空捕获,但仍引发异常

来自分类Dev

在不链接其他dll并在c#中引发异常的情况下检查Windows用户的存在

来自分类Dev

.NET Net.pkcs11.dll在objToken.TokenInfo中引发异常system.formatException

来自分类Dev

引发异常:UWP App Start上的mscorlib.ni.dll中的“ System.Exception”

来自分类Dev

.NET Net.pkcs11.dll在objToken.TokenInfo中引发异常system.formatException

来自分类Dev

Parser.exe中的(ntdll.dll)引发异常:访问冲突读取位置

来自分类Dev

引发异常:System.Data.dll中的“ System.Data.SqlClient.SqlException”

来自分类Dev

引发异常:Bloomberglp.Blpapi.dll中的“ Bloomberglp.Blpapi.NotFoundException”

来自分类Dev

WaitForExit()引发异常C#

来自分类Dev

WaitForExit()引发异常C#

来自分类Dev

C#转换引发异常

来自分类Dev

无法通过C ++中的引用捕获引发的异常

来自分类Dev

为什么Python无法捕获C ++中引发的异常?

来自分类Dev

在Python中引发异常

来自分类Dev

在PostgreSQL中引发异常

来自分类Dev

如何捕获在JsonConverter属性中引发的异常?

来自分类Dev

捕获导入模块中引发的异常

来自分类Dev

备份捕获EventHandler中引发的异常

来自分类Dev

无法捕获PHP中引发的COM异常

来自分类Dev

如何测试在junit中引发并捕获了异常

来自分类Dev

如何捕获在JsonConverter属性中引发的异常?

来自分类Dev

Delphi在构造函数中引发异常

来自分类Dev

引发并捕获异常,或使用instanceof?

来自分类Dev

捕获从异步lambda引发的异常

来自分类Dev

Delphi DLL 类异常

Related 相关文章

热门标签

归档