Delphi DLL 可以被 PInvoked 并在 C# 中使用吗?

雷邦

我正在尝试迁移在 C++ builder 中构建的应用程序。由于时间限制,我们的客户希望我们导入 VCL 功能,而不是查找 .net 等效项或创建新功能。

我试图 pinvoke rtl100.bpl 的 ExtractRelativePath 函数,它具有 AnsiString 作为返回和参数。然后我使用 IntPtr 来传递和获取字符串,但是在调用 API 时会发生 AccessViolationException。

这是来自 rtl100.bpl 的函数原型

PACKAGE AnsiString __fastcall ExtractRelativePath(const AnsiString BasrName, AnsiString DestName);

这就是我如何调用它。

[DllImport("rtl100.bpl", EntryPoint = "@Sysutils@ExtractRelativePath$qqrx17System@AnsiString1", CallingConvention = CallingConvention.Cdecl)]
Internal static extern IntPtr ExtractRelativePath(IntPtr BaseName, IntPtr DestName);

当然,我将使用 thr marshal 类分配和释放 intptrs。

问题是,delphi 库真的可以用在 c# 中吗?它的大部分 API 使用 AnsiString,这是一个原生的 delphi 字符串。或者我们应该开始考虑使用 .net 函数?

谢谢

大卫·赫弗南

您有多个问题:

  1. Delphi RTL 使用其他工具链不支持的基于寄存器的调用约定。
  2. AnsiString 是 Delphi 特定的类型,不能与其他工具链相互传递。
  3. 这个特殊的函数分配调用者必须处理的堆内存。您的 C# 代码无法这样做。

我认为您可能需要重新调整客户的期望。你正在尝试的是不可行的。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我可以在cgo中使用c ++吗?

使用C#从Delphi DLL中检索记录数组

如何在C#中创建DLL并在Delphi XE6中调用

可以在C ++中使用Java Swing吗

我可以为C#制作自己的JIT \ Interpreter \ Compiler并在Visual Studio中使用它吗?

您可以在UWP的C#代码中使用C ++ DLL吗?

与C ++ dll的Delphi通讯(参数)

如何动态加载DLL并在其中使用类(实现已知接口)[C#]

如何创建C ++ DLL(使用DEV -C ++)并在MT4脚本中使用(逐步)

我可以删除SetHash的元素并在Perl 6中使用它的值吗?

可以将Angular 6库捆绑并在Angular 5应用程序中使用吗?

从C ++ DLL编辑Delphi记录

如何在Delphi中使用C#创建的DLL

模板文字可以在C ++中使用吗?

BadImageFormatException:尝试在C#中使用C ++ DLL文件吗?

C ++到Delphi dll调用

我可以在非托管Delphi EXE中使用托管C#DLL吗?

bash / zsh别名:我可以抓取参数并在subshell中使用吗?

可以在Lua中加载C ++ dll文件吗?

在Delphi中实现C DLL

如何在DLL Delphi中使用IdFTP

.net可以从内存中动态加载c ++ / cli dll吗?

我可以在C ++中使用Tk吗?

在Delphi中使用C#DLL仅使用第一个函数参数

使用Delphi 10从C#dll打开Windows证书列表

在C ++中使用来自delphi dll的回调

有什么办法可以从 php 获取结果并在 c# 上使用它吗?喜欢登录?

Delphi 5 可以使用 C# .Net 库吗?

有没有办法在C#中创建DLL并在SQL Server中使用DLL的函数