【问题标题】:dll C# AccessViolationExceptiondll C# AccessViolationException
【发布时间】:2011-08-12 11:25:35
【问题描述】:

Delphi写的dll,按照手册我要先用SET_XML()设置xml路径,然后用你喜欢的任何函数。


Delphi 功能根据手册:

function SET_XML(var path: PAnsiChar): LongInt; 
function GET_CALCULATION_FAN_ALONE(var fanDescription: PAnsiChar): LongInt;

根据手册在VB中使用:

Public Declare Function SET_XML_PATH Lib "fan.dll" (ByRef path As String) As Long
Public Declare Function GET_CALCULATION_FAN_ALONE Lib "fan.dll" (ByRef path As String) As Long

Sub Main()
    Dim a As Long, b As Long, Str_Result As String, Str_Input As String
    Str_Input = "C:\Users\Sebastiaan\Documents\Visual Studio 2010\Projects\Lucam selectie\Lucam selectie\bin"
    a = SET_XML_PATH(Str_Input)
    Str_Result = "65464;;;1,2;;23;424,8;0,3766;;"
    b = GET_CALCULATION_FAN_ALONE(Str_Result)
End Sub

我确实用 C# 重写了它

const string _dllLocation = "EbmPapstFan.dll";

[DllImport(_dllLocation)]
public static extern long SET_XML_PATH(ref String path);

[DllImport(_dllLocation)]
public static extern long GET_CALCULATION_FAN_ALONE(ref String fanDescription);

public Main()
{
    String path = @"C:\Users\Sebastiaan\Documents\Visual Studio 2010\Projects\Lucam selectie\Lucam selectie\bin";
    long a = SET_XML_PATH(ref path);

    String fanDescription = "65464;;;1,2;;23;424,8;0,3766;;";
    long c = GET_CALCULATION_FAN_ALONE(ref fanDescription);
}

运行 de 应用程序时,我得到一个 AccessViolationException

尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

设置断点并逐步调试代码时,一切正常。有时我在调试模式下遇到错误(在线“long c = GET_CALU ...”)

我做错了什么?

【问题讨论】:

  • 我不确定,但是当我看到这个错误时,我总是在想 System.Diagnostics.Process.EnterDebugMode();

标签: c# delphi dll


【解决方案1】:

我不熟悉从 C# 调用 Delphi,但从快速搜索来看,调用约定似乎存在一些问题(如何从堆栈中推送和弹出值)。查看这些主题:

Calling a Delphi DLL from C# produces unexpected results

Calling a delphi DLL method from C# Code

从这些来看,由于“fastcall”调用约定,听起来可能无法直接调用它。您可以尝试更改调用约定,这可能值得快速测试。请参阅此页面:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx

如果这不起作用,我可能会编写一个调用 Delphi DLL 的 C 包装 DLL,并验证它是否有效(确保它不仅仅是 DLL 中的错误)。如果是这样,那么您可以通过在包装 DLL 的函数上使用 DllImport 从 C# 程序调用 C DLL。

希望对你有所帮助,

约翰

【讨论】:

  • 尝试了 StdCall 但仍然是同样的错误,我正在尝试编写包装器,我会告诉你它是否有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多