检查Delphi DLL在C#中使用的安全性

我有一个DLL,负责一些特殊的玻璃效果的自定义绘图。 我把它放在一个DLL中有三个原因: 1)因此它可以很容易地重复使用和分发,当然不会权衡它的主机应用程序, 2)所以我可以将它分发给开发人员,而他们不知道它是如何工作的, 3)因此它可以从C#中使用。 它目前在Delphi中工作,但我知道我需要做很多改动才能使它支持C#。 例如,主DLL函数包含1个参数(一个Record),其中包含许多我知道在C#中不起作用的类型(如String,也许是TColor)。 项目尚未完成100%,但正在运作。

我需要有人指出实现这一目标的最简单方法。 代码太大了,不能在这里发布,所以这里是在Pastebin

这是我需要知道的:

  • 我应该像我一样继续使用唱片,还是使用像Packed Record这样的其他东西?
  • 在这些记录中使用除String或PChar之外的其他东西的任何技巧?
  • 我如何在C#中包装此DLL? (顺便说一句,我知道C#很少)
    • 如何定义等效记录传递给DLL函数?
    • 如何在C#中定义等效常量? (JD#ClassCommon.pas的C#版本)
    • 如何获取要发送到DLL的canvas句柄(HDC)和父句柄(HWND)?
    • 什么相当于TColor?
  • 在记录中传递TColor等类型是否安全?
  • 您是否预见到我的代码中的任何其他问题?

文件列表:

库:JDGlassLib.dll *

  • 单位:JDGlassCommon.pas *

包:JDLib.bpl

  • 单位:JDGlassCommon.pas *
  • 单位:JDGlass.pas *

程序:JDLibTestApplicationD7.exe

  • 表格:JDLibTestAppD7.dfm *
  • 单位:JDLibTestAppD7.pas *

    * =代码包含在上面的链接中

    JDGlassCommon.pas在DLL和Component中共享

应该看起来像这样: 应该是这样的

注意:我不是要求重写,尽管你非常欢迎。 我只需要一些如何解决这个问题的技巧。


PS:原始玻璃绘图代码记入StackOverflow的“NGLN”,回答我的先前问题: delphi定制绘图 – 发光玻璃

我应该像我一样继续使用唱片,还是使用像Packed Record这样的其他东西?

记录有利于互操作。 不要打包它们,只会使互操作更难。

在这些记录中使用除String或PChar之外的其他东西的任何技巧?

不要使用字符串。 这只是Delphi,甚至特定于Delphi版本。 互相支持PChar很好。 有时,在记录中使用固定长度的内联字符数组可能是最简单的。 这取决于用途。

我如何在C#中包装此DLL?

使用p / invoke从C#调用它。

在记录中传递TColor等类型是否安全?

是的,这很容易使用。 确保它是真正的RGB颜色,而不是像clWindow那样的特殊颜色。

您是否预见到我的代码中的任何其他问题?

玻璃渲染可能与C#库使用的渲染不兼容。 它很可能取决于您的C#代码是否使用WinForms或WPF。 事实上,您可能会发现C#开发人员会发现使用本机C#代码更容易。 我希望玻璃渲染在常见的C#GUI框架中得到很好的支持。