Имя: Пароль:
IT
 
PInvoke из C++ к C#
,
0 megabax
 
11.01.17
21:48
Добрый день. Написал на C++ вот такую dll-ку:
extern "C" __declspec( dllexport ) int MyFunc(int parm1)
{
    return parm1*2;
}
И вот так пытаюсь подключить ее к C#:
        [DllImport("MyLib.dll", SetLastError = true)]
        public static extern IntPtr MyFunc(IntPtr parm1);

        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr a = new IntPtr(2);
            MessageBox.Show(MyFunc(a).ToString());
        }
    }
но при вызове выскакивает исключение:
Вызов функции PInvoke "WindowsFormsApplication1!WindowsFormsApplication1.Form1::MyFunc" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой.

Подскажите пожалуйста, что делаю не так.
1 Волшебник
 
модератор
11.01.17
22:30
разбалансировал стек
2 Mauser
 
11.01.17
22:34
IntPtr
3 Кирпич
 
11.01.17
23:15
Соглашение о вызове наверное не совпадает
4 Кирпич
 
11.01.17
23:16
Или intPtr 64 разрядный
5 megabax
 
12.01.17
20:50
Спасибо всем, разобрался сам, оказывается надо было сделать вот так:
        [DllImport("MyLib.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
        public static extern int MyFunc(int parm1);

        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr a = new IntPtr(2);
            MessageBox.Show(MyFunc(2).ToString());
        }
А что кстати такое IntPtr в C# и зачем оно нужно?
6 Неверный Параметр И
 
12.01.17
21:33
(5) >А что кстати такое IntPtr в C# и зачем оно нужно?

Сильно. Продолжай, пожалуйста.
7 trdm
 
12.01.17
21:46
(5) > IntPtr a = new IntPtr(2);
Оно ж не используется.
8 megabax
 
12.01.17
21:49
(7) Я итак и так пробовал. Сначала было
 private void button1_Click(object sender, EventArgs e)
        {
            IntPtr a = new IntPtr(2);
            MessageBox.Show(MyFunc(a).ToString());
        }
9 trdm
 
12.01.17
21:50
Фишка была в том, что ты в объявлении внешней функции не тот тип написал?
public static extern >>>>int<<<< MyFunc(int parm1);
Туповатый компилер у шарпа. Нет что-бы сказать что-то типа:
"Не найдена функция с сигнатурой бла-бла-бла, есть с сигнатурой бабла-бабла".
10 trdm
 
12.01.17
21:50
разбалансированный стек- тоже в принципе верно, но ни о чем..
11 Serginio1
 
12.01.17
22:15
Так для общего развития http://rsdn.org/forum/dotnet/6608282.flat
12 Serginio1
 
12.01.17
22:16
13 Mauser
 
12.01.17
23:01
(11)(12) Ты не понял, тут же все просто - "Туповатый компилер у шарпа". А ты тут со своим Ъ выступаешь.
14 Mauser
 
12.01.17
23:04
(12) Ссылка на ответ с оценкой -1, это супер!
15 Кирпич
 
12.01.17
23:10
(5) ты зачем этот  IntPtr туда вообще приплел?  Пиши Int32
16 Кирпич
 
12.01.17
23:13
(9) откуда компилятор узнает какая в dll сигнатура должна быть?  Ты настоящий одинесник и добродетельный мистянин :)
17 Кирпич
 
12.01.17
23:20
(5) "А что кстати такое IntPtr в C# и зачем оно нужно?"
https://msdn.microsoft.com/ru-ru/library/system.intptr(v=vs.110).aspx
18 trdm
 
12.01.17
23:56
(16) из *.h и lib файлов ептыть.
19 Serginio1
 
13.01.17
00:13
(13) Где ты Ъ увидел.
(14) А там такие острые как и ты.
20 Кирпич
 
13.01.17
07:45
(16) где ты в C# видел .h и .lib файлы?
21 Serginio1
 
13.01.17
10:52
22 trdm
 
13.01.17
11:03
(20) ну дык либу он на плюсе накатал. Или оно в шурпе все по другому?
23 Кирпич
 
13.01.17
11:27
(22)"Или оно в шурпе все по другому?" ну как бы везде всё по другому. Если бы бабушка была дедушкой...
24 Mauser
 
13.01.17
11:48
(21) Судя по https://chat.stackexchange.com/rooms/51694/discussion-on-question-by-serginio---typescript--net ты решил наконец-то отстать от 1С и заняться другим делом? Похвально!
25 Serginio1
 
13.01.17
14:10
(24) Недождешься! Я 1С ник!
26 Кирпич
 
13.01.17
14:48
(25) Ты C# ник, подлец и мерзавец :)
27 Serginio1
 
13.01.17
15:04
(26) Зарабатываю я на 1С. А .Net, TypeScript, Angular 2 это просто для души
28 Кирпич
 
13.01.17
15:09
(27) у меня для души волейбол
29 Serginio1
 
13.01.17
15:21
(28) Ну я еще и крестикм вышиваю, веренн фитнесом занимаюсь.
Да 1С у меня тоже для души. Просто за неё платят деньги
30 megabax
 
14.01.17
12:20
Добрый день. Еще вопрос возник. Сейчас я попытался использовать в подключаемой к C# сишной библиотеке OpenCV. Подключил к ней библиотеки и сделал вот такой вот текст:
#include "stdafx.h"
#include "stdio.h"
#include <iostream>
#include <fstream>
#include <cv.h>
#include <highgui.h>

using namespace std;

IplImage* image = 0;
IplImage* src = 0;

extern "C" __declspec( dllexport ) int MyFunc(int parm1)
{
    return parm1*2;
}

int InnerFunc1(int a)
{
    return a+2;
}

extern "C" __declspec( dllexport ) int MyFunc1(int parm1)
{
    return parm1*InnerFunc1(parm1);
}


extern "C" __declspec( dllexport ) int WriteToFile()
{
    ofstream file;
    file.open("D:\\1\\test_lib.txt",ios::out|ios::app);
    if (!file) {
        return -1;
    }
    file << "This is test C++ proc" << endl;
    file.close();
    return 1;
}

extern "C" __declspec( dllexport ) int MyProc()
{
        // имя картинки задаётся первым параметром
        char* filename = "d:\\3\\Dscn0116.jpg";

        // получаем картинку
        image = cvLoadImage(filename,1);
        // клонируем картинку
        src = cvCloneImage(image);

        assert( src != 0 );

        // окно для отображения картинки
        cvNamedWindow("original",CV_WINDOW_AUTOSIZE);

        // показываем картинку
        cvShowImage("original",image);

        // освобождаем ресурсы
        cvReleaseImage(& image);
        cvReleaseImage(&src);
        // удаляем окно
        cvDestroyWindow("original");
        return 0;
}

И он почему то не компилируется, говоря:
Ошибка    7    error LNK1120: 6 неразрешенных внешних элементов    D:\Самообразование\C++\DllDemo\MyLib\Debug\MyLib.dll    MyLib
Ошибка    5    error LNK2019: ссылка на неразрешенный внешний символ _cvCloneImage в функции _MyProc    D:\Самообразование\C++\DllDemo\MyLib\MyLib\MyLib.obj    MyLib
Ошибка    1    error LNK2019: ссылка на неразрешенный внешний символ _cvDestroyWindow в функции _MyProc    D:\Самообразование\C++\DllDemo\MyLib\MyLib\MyLib.obj    MyLib
Ошибка    6    error LNK2019: ссылка на неразрешенный внешний символ _cvLoadImage в функции _MyProc    D:\Самообразование\C++\DllDemo\MyLib\MyLib\MyLib.obj    MyLib
Ошибка    4    error LNK2019: ссылка на неразрешенный внешний символ _cvNamedWindow в функции _MyProc    D:\Самообразование\C++\DllDemo\MyLib\MyLib\MyLib.obj    MyLib
Ошибка    2    error LNK2019: ссылка на неразрешенный внешний символ _cvReleaseImage в функции _MyProc    D:\Самообразование\C++\DllDemo\MyLib\MyLib\MyLib.obj    MyLib
Ошибка    3    error LNK2019: ссылка на неразрешенный внешний символ _cvShowImage в функции _MyProc    D:\Самообразование\C++\DllDemo\MyLib\MyLib\MyLib.obj    MyLib

Подскажите пожалуйста, что делаю не так?
31 Кирпич
 
14.01.17
12:25
(30) купи уже книжку
32 megabax
 
14.01.17
12:30
(31) Еще б знать какую, их дофига всяких