Доступ к C ++ DLL из программы на C # - PullRequest
0 голосов
/ 23 сентября 2018

Я очень плохо знаком с взаимодействием, и у меня возникают проблемы с определением импорта dll из DLL C ++.Документация для DLL выглядит следующим образом:

bool __stdcall __declspec(dllexport) InitHW(char *name, char *model, int& type)

Итак, код, который я пробовал, выглядит следующим образом, и он дает исключение system.AccessViolation:

[DllImport("extIO_IC7610.dll", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern bool InitHW(string name, string model, int type);

private unsafe void Initialize()
{
    try
    {
        bool result;

        string name = "Test";
        string model = "Model";
        int type = 3;

        result = InitHW(name, model, type);
    }
    catch (Exception ex)
    {

    }
}

Я только что понял, что это предполагаетсявернуть данные.Может кто-нибудь показать мне ошибки в моем понимании здесь?Спасибо, Том

На основании комментариев я изменил вещи, чтобы они выглядели так:

[DllImport("extIO_IC7610.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.I1)] 
public unsafe static extern bool InitHW(string name, string model, ref int type);

unsafe private void Initialize())
{

    try
    {
        bool result;

        string name = ""; 
        string model = ""; 
        int type = 3;
        result = InitHW(name, model, ref type);

    }
    catch (Exception ex)
    {

    }
}

Это все еще не работает.Теперь я получаю сообщение об ошибке, что стек не сбалансирован из-за несоответствия подписей.Я думаю, что строки сделаны правильно, но параметр & int все еще может быть проблемой.Том

1 Ответ

0 голосов
/ 24 сентября 2018

Ну, я решил это.Здесь было несколько подсказок, но ничего действительно правильного.После осмотра последних нескольких часов это решение:

    [DllImport("extIO_IC7610.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
    [return: MarshalAs(UnmanagedType.I1)] 
    public unsafe static extern bool InitHW(StringBuilder name,  StringBuilder model, int* type);

unsafe void Initialize()
{
           bool result;

            int type = 0;
            var name = new StringBuilder(250);
            var model = new StringBuilder(250);

            result = InitHW(name, model, &type);

            string _name = name.ToString();
            string _model = model.ToString();

}

...