2011-08-12 5 views
2

dll은 델파이로 작성된 설명서에 따라 xml 경로를 SET_XML()로 먼저 설정 한 다음 원하는 모든 함수를 사용해야합니다.dll C# AccessViolationException


델파이 기능 설명서있어서, 상기 설명서에 따라 VB에서

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

사용 :

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 ...").

내가 뭘 잘못하고 있니?

+0

는 잘 모르겠어요하지만 내가) (난 항상 System.Diagnostics.Process.EnterDebugMode에 대해 생각하고이 오류를 볼 때, – Cynede

답변

3

저는 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

문제가 해결되지 않는 경우를, 나는 아마 델파이 DLL을 호출하는 C 래퍼 DLL을 작성하고 작동하는지 확인 것 (반드시는 DLL 단지 버그 아니다 만들기). 그렇다면 래퍼 DLL 함수에서 DllImport를 사용하여 C# 프로그램에서 C DLL을 호출 할 수 있습니다. 조금 도움이

희망,

+0

StdCall을 시도했지만 여전히 동일한 오류가 발생했습니다. 래퍼를 쓰려고 시도 중입니다. 작동하는지 알려 드리겠습니다. – Sebastiaan