我有一些从 .NET 应用程序调用的本机 dll (Delphi)。如果 DLL 中发生任何类型的崩溃,整个 .NET 应用程序就会崩溃。如何防止这种情况并确保 .NET 应用程序不会崩溃并识别错误。我不需要来自本机 dll 的特定错误反馈(这是不可能的,因为它崩溃了)。但是我想在我的 .NET 日志文件中写一些东西,比如“xyz.dll 崩溃”。
这是否可能从.NET P/Invoking a (Delphi or C++)dll?
如果您的 DLL 从其导出的函数中抛出异常,就会发生这种情况。DLL 不能这样做,因此您需要捕获 DLL 边界处的所有异常,并将它们转换为错误代码返回值。
如果您无法控制 DLL,那么您需要为其编写一个包装层。创建另一个调用原始 DLL 的本机 DLL 并捕获它抛出的任何异常。您可以使用我怀疑的另一个 Delphi DLL 来执行此操作,或者使用使用 SEH 捕获异常的 C 或 C++ DLL 来执行此操作。
可以为这样的包装 DLL 编写代码生成脚本。如果您需要包装很多函数,您会想要这样做。
Delphi DLL 中的所有入口点都必须放在 try...except 块中,并向 .NET 端返回一个值 (int),指示调用是否已完成错误。