dll C# AccessViolationException

本文关键字:AccessViolationException dll | 更新日期: 2023-09-27 18:05:38

dll写在Delphi中,根据手册我必须先设置xml路径SET_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);
}

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

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

当设置断点并逐步调试代码时,一切都运行良好。有时我在调试模式下得到错误(在行"long c = GET_CALU…")

我做错了什么?

dll C# AccessViolationException

我不熟悉从c#调用Delphi,但从一个快速搜索,似乎有一些问题与调用约定(如何值被推和弹出从堆栈)。查看这些线程:

从c#调用Delphi DLL会产生意想不到的结果

从c#代码中调用delphi DLL方法

从这些,听起来可能不可能直接调用这个,因为"fastcall"调用约定。您可以尝试更改呼叫约定,这可能值得快速测试。请看此页:

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

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

希望对你有帮助,

约翰