在Delphi XE6中调用c# dll函数存在访问冲突

本文关键字:dll 函数 存在 访问冲突 调用 Delphi XE6 | 更新日期: 2023-09-27 18:06:18

在将项目从Delphi 2007迁移到XE6之后,我们不再能够正确调用我们构建的c# dll中的导出函数。c#代码似乎执行得很好,做了它应该做的事情,但是在它完成之后,它抛出了一个访问冲突。

代码:

Result := False;
  lib := LoadLibrary('KJPDFExport.dll');
  if lib = 0 then RaiseLastOSError;
  try
    try
      @prc := GetProcAddress(lib, 'ExportOffice');
      if Assigned(prc) then
      begin
        Result := prc(sourceFile,
            ChangeFileExt(destinationFile, ''),
            pdfBackgroundHeadFile,
            pdfBackgroundSubFile);
      end
      else
        ShowMessage('ExportOffice not found in KJPDFExport.dll');
    except
      on e:Exception do
      begin
        ShowMessage(e.Message);
      end;
    end;
  finally
    FreeLibrary(lib);
  end;

我传递给c#函数的字符串都是ansistring。在项目的2007版本中,它们曾经只是"字符串",因此我将它们更改为AnsiString。

我很困惑,我找了好几个小时都没找到问题所在。

在Delphi XE6中调用c# dll函数存在访问冲突

结果证明它一直有效。Delphi调试器不知道如何处理c#异常。即使在c#的throw语句周围有try/catch语句,Delphi调试器仍然会将其视为访问冲突。当你只是简单地按下继续它的工作。崩溃的原因是另一段代码必须转换为使用AnsiString。

是否尝试使用本地ansiString变量?ChangeFileExt()返回字符串值。

类似这样:

var sIn, sOut : ansiString;
  Result := False;
  sIn  := ansiString(sourceFile);
  sOut := ansistring(ChangeFileExt(destinationFile, ''));
  lib := LoadLibrary('KJPDFExport.dll');
  if lib = 0 then RaiseLastOSError;
  try
    try
      @prc := GetProcAddress(lib, 'ExportOffice');
      if Assigned(prc) then
      begin
        Result := prc(Sin,
                      sOut,
            pdfBackgroundHeadFile,
            pdfBackgroundSubFile);
      end
      else
        ShowMessage('ExportOffice not found in KJPDFExport.dll');
    except
      on e:Exception do
      begin
        ShowMessage(e.Message);
      end;
    end;
  finally
    FreeLibrary(lib);
  end;