【问题标题】:Delphi dll and c# pinvoke declarationDelphi dll 和 c# pinvoke 声明
【发布时间】:2013-08-11 18:10:21
【问题描述】:

我想知道是否有人可以检查我的 c# dllimport 声明中是否有使用 Delphi XE2 编译的 dll。从 ISAPI 包装器 dll 调用此 dll 工作正常,但我没有运气从 c# asp.net 应用程序调用它。

Delphi 过程定义为:

procedure ExecuteService(const RequestJSON :PWideChar; out ResponseJSON :Pointer; out ResponseJSONSize :Integer; out ResponseContent :Pointer; out ResponseContentSize :Integer); stdcall;

而c#声明是:

 [DllImport("services.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern void BIExecuteService(
            String requestJSON,
            out IntPtr reposnseJSON,
            out int reposnseJSONSize,
            out IntPtr reposnseContent,
            out int reposnseContentSize
        );

有时它会起作用,但大多数情况下它会给出 System.AccessViolationException。

我这几天一直在尝试解决这个问题,声明看起来正确吗?

编辑: 附加到 Delphi XE2 中的 IISExpress 进程,错误似乎发生在 clr.dll 中。也许我的图书馆损坏了一些东西,但我不知道如何找出哪里!

谢谢,

AJ

【问题讨论】:

  • 函数的调用方式可能存在问题。你没有表现出来。理想情况下,您将同时显示 Delphi 和 C# 调用代码。正如所问的,这个问题很容易回答,而且答案可能对你没有用。这是 XY 问题的经典示例。

标签: c# asp.net delphi pinvoke


【解决方案1】:

您的 p/invoke 声明是正确的。你的问题在别处。

【讨论】:

  • 谢谢,一般来说什么会导致 system.accessviolation 异常?
  • 特别是 AV 是由试图访问未映射到您的地址空间或具有不兼容保护级别的地址引起的。前者通常访问过时的指针。后者不太常见,当您尝试写入只读内存时会出现。
  • 你需要做一些调试。进行可靠的复制,然后将其删减,直到找出生成 AV 的代码。
  • 我尝试过这样做,但没有得到一致的结果。此外,这似乎是一个时间问题,还取决于同时请求的数量。令人难以置信的令人沮丧!使用诸如 fastmm 之类的内存管理器会有帮助吗?有时我什至没有得到异常,IISExpress 只是崩溃了。奇怪的是,在同事的 PC 上一切正常。在我的情况下,它不适用于 VS2012 中的 IISEXpress 或完整的 IIS。
  • FastMM 完整调试可能会有所帮助。
猜你喜欢
  • 2010-12-31
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 2012-07-28
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
相关资源
最近更新 更多