|
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
|
(14) Кстати пополни свой словарный запас обо мне словом await
http://ru.stackoverflow.com/questions/613820/%d0%98%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b2-typescript-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%be%d0%b2-net |
|||
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) Еще б знать какую, их дофига всяких
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |