dll C # AccessViolationException - PullRequest
       10

dll C # AccessViolationException

2 голосов
/ 12 августа 2011

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

Что я делаю не так?

1 Ответ

3 голосов
/ 12 августа 2011

Я не знаком с вызовом Delphi из C #, но из быстрого поиска выясняется, что существуют некоторые проблемы с соглашениями о вызовах (как значения выталкиваются и извлекаются из стека). Смотрите эти темы:

Вызов DLL-библиотеки Delphi из C # приводит к неожиданным результатам

Вызов метода DLL delphi из кода C #

Исходя из этого, может показаться, что это невозможно вызвать напрямую из-за соглашения о вызовах "fastcall". Вы можете попробовать изменить соглашение о вызовах, что может стоить быстрого теста. Смотрите эту страницу:

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

Если это не сработает, я, вероятно, просто напишу DLL-оболочку C, которая вызывает Delphi DLL, и проверим, работает ли она (убедитесь, что это не просто ошибка в DLL). Если это так, то вы можете просто вызвать C DLL из программы на C #, используя DllImport в функции DLL-оболочки.

Надеюсь, это немного поможет,

John

...