Как подключить dll(c++) к с#?

198
25 апреля 2018, 04:11

Знаю, что популярная проблема. Но нужно срочно, а я вообще не бум-бум.

Нужно подключить вот эту функцию:

DLL_EXPORT int __stdcall EvalCRC(IStream* Data, IStream* Params, IStream* Output)
{
    if (!Data) return ERROR_NULL_DATA;
    // Data - это входной поток с прошивкой, контрольку в которой нужно пересчитать
    // Params и Output пока не используются и зарезервированы на будущее
    int Result = PLUGIN_SUCCESS; // По-умолчанию возвращаем результат успешного выполнения
    ULARGE_INTEGER size_;
    LARGE_INTEGER larg_;
    //ENCODE_START
    larg_.QuadPart = 0;
    Data->Seek(larg_, STREAM_SEEK_END, &size_);
    // Считаем КС прошивки
    if (size_.QuadPart == VALIDFWSIZE1 || size_.QuadPart == VALIDFWSIZE2)
    {
        try
        {
            char arr[IDLEN+1];
            ULONG ulong;
            unsigned int caloffset;
            switch(size_.QuadPart)
            {
                case VALIDFWSIZE1:
                {
                    // Калибровки
                    larg_.QuadPart = CAL_POS1;
                    Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
                    Data->Read(&arr, sizeof(arr), &ulong); // Вычитываем идентификатор
                    arr[IDLEN]=0x00;
                    if (CheckNumber(arr)) caloffset=CAL_POS1;
                    else return ERROR_SIGNATURE;
                }
                break;
                case VALIDFWSIZE2:
                {
                    // Фулл
                    larg_.QuadPart = CAL_POS2;
                    Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
                    Data->Read(&arr, sizeof(arr), &ulong); // Вычитываем идентификатор
                    arr[IDLEN]=0x00;
                    if (CheckNumber(arr)) caloffset=CAL_POS2;
                    else
                    {
                        larg_.QuadPart = CAL_POS3;
                        Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
                        Data->Read(&arr, sizeof(arr), &ulong); // Вычитываем идентификатор
                        arr[IDLEN]=0x00;
                        if (CheckNumber(arr)) caloffset=CAL_POS3;
                        else return ERROR_SIGNATURE;
                    }
                }
                break;
            }
            larg_.QuadPart = caloffset;
            Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
            WORD wval=0;
            for(unsigned int i=0;i<(cRangeSize/2)-1;i++)
            {
                WORD wword;
                Data->Read(&wword, sizeof(WORD), &ulong);
                wword = (wword >> 8) | (wword << 8); // Переворачиваем
                if (i!=cCSPos/2) wval += wword; // Считаем все, кроме контрольных сумм
            }
            wval=0-wval;
            larg_.QuadPart = caloffset+cCSPos;
            Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
            wval = (wval >> 8) | (wval << 8); // Переворачиваем
            Data->Write(&wval, sizeof(WORD), &ulong);
        }
        catch(...)
        {
            Result = ERROR_EXCEPTION;
        }
    }
    else Result = ERROR_INVALID_SIZE;
    return Result;
}

Пробовал по всякому, то типы данных не совпадают, то просто какие-то вылеты без ошибок и результатов. Если это не сложно, подскажите, как должна выглядеть строка подключения?

Answer 1

Подключить то, допустим, можно так (предполагая, что используется интерфейс IStream из COM Structured Storage):

using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
[DllImport("mylib.Dll")]
static extern int EvalCRC(
    IStream data, 
    IStream parms, 
    IStream output
);

Только обычные потоки System.IO.Stream не реализуют COM-интерфейс IStream, чтобы с ними работать придется реализовать какую-то свою обертку. Можно позаимствовать из исходников .NET

READ ALSO
Передача DateTime в URL методу

Передача DateTime в URL методу

Есть метод контроллера сервера Refresh(DateTime? Date) Есть метод jQuery который отправляет ajax-запрос по URL наподобие http://localhost:1234/Home/Refresh?Date=2304

176
Выгрузить привязанные данные в word

Выгрузить привязанные данные в word

Подскажите пожалуйста, как (c# winforms vs2010) обратиться (чтобы выгрузить в word) к привязанным данным "Value_1 и Value_2"? Те

193
C#, Visual Studio 2017, Работа с Word (Office 365)

C#, Visual Studio 2017, Работа с Word (Office 365)

Пытаюсь запустить простейший код консольного приложения:

205
Многочисленный переход между сценами

Многочисленный переход между сценами

У меня есть несколько уровней, между которыми есть сцена, которая отвечает за переход на следующий уровень, можно ли сделать так, чтобы за это...

184