Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
1

Использование функций DLL, написанной на C++

05.07.2014, 21:42. Показов 4294. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В проекте C# нужно использовать функции, написанные на с++. Создал DLL-ку, все отлично цепляется. Вопрос в том, что в с++ проекте есть своя структура
C++
1
2
3
4
5
struct Sequence{
    vector <vector <string *> > data;
    vector <string> SequenceStack;
    vector <string> SequenceSolution;
};
и есть функция, которая с этой структурой работает
C++
1
2
3
void step1(Sequence& CurrentNode){
//работает функция
}
И теперь мне нужно эту функцию вызвать в проекте c#. Но если пишу
C#
1
public static extern void step1(Sequence& CurrentNode);
то конечно ошибка, т.к. Sequence не определен. Как правильно определеить Sequence в c# проекте?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2014, 21:42
Ответы с готовыми решениями:

Использование DLL, написанной на delphi
Есть DLL CscLink.dll, но описание к ней на delphi Так как в delphi &quot;0&quot;, пытаюсь использовать в C#....

Вызов функций из DLL, написанной на CBuilder.
Всем привет! Есть немаленький софт, написанный на CBuilder. Нужно подгрузить в программе на...

Использование функций DLL, подключенных к приложению
Написал вот такую dll,ку using System; using System.ComponentModel; using...

Использование DLL, написанной на C++, в C# (указатели)
Всем привет! Есть DLL, написанная на C++, в ней описана такая функция: int ReadData(int kpn,int...

17
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
05.07.2014, 22:02 2
Цитата Сообщение от Rabbit13245 Посмотреть сообщение
Как правильно определеить Sequence в c# проекте?
К сожалению, надежного способа сделать это не существует.
У C++ отсутствует стандартный двоичный интерфейс (ABI), поэтому его
сущности нельзя выносить за пределы модулей. Единственный более-менее
приемлемый вариант - обернуть все в C-шные функции, указатели и
структуры, оперируя типами с известными размерами и выравниванием,
общими для обоих языков - C++ и C#, как это сделано в Win32 API / PInvoke.
2
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
05.07.2014, 22:09 3
C Sharp ничего не знает о таких типах как std::string std::vector,
как не знает о передаче по ссылке
Цитата Сообщение от Rabbit13245 Посмотреть сообщение

void step1(Sequence& CurrentNode){


Значит перепишите структуру, вместо вектора и строк используйте массивы.
Вместо передачи по ссылке передавайте структуру по указателю.
C++
1
void step1(Sequence* CurrentNode){
Не знаю вашей задачи, возможны и другие варианты.
1
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
05.07.2014, 22:51  [ТС] 4
MrCold, спасибо.

Добавлено через 3 минуты
MrCold, то есть вообще уйти от использования вектора? даже если нигде явно это не будет указываться, все равно он не поймет?

Я к тому, что если переписать функцию, уйдя просто от вызова по ссылке.
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
05.07.2014, 22:57 5
Вам передаваемую структуру ещё в коде C# описать придется, поэтому только массивы.
А в параметрах функции используйте С-стиль : Структуры в стиле С, указатели, массивы
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
05.07.2014, 22:59  [ТС] 6
MrCold, Я про другое.
Если на с++ будет функция
C++
1
2
3
void step1(void){
//работает функция
}
но она будет изменять как раз элемент структуры
C++
1
2
3
4
5
struct Sequence{
    vector <vector <string *> > data;
    vector <string> SequenceStack;
    vector <string> SequenceSolution;
};
так возможна будет работа?
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
05.07.2014, 23:01 7
Да, тут конечно. только про параметры говорил.
Внутри длл пишите на С++ , без проблемь
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
05.07.2014, 23:06  [ТС] 8
MrCold, тогда вопрос следующий)
Код в dll
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
__declspec(dllexport) void readDataFromFile(string fname, char delimiter)
    {
        ifstream infile( fname );
        while (infile)
        {
            string s;
            if (!getline( infile, s )) 
                break;
 
            istringstream ss( s );
            vector <string> record;
 
            if (!getline( ss, s, ':' )) 
                break;
 
            record.push_back( s );
            if(s==clas)
                celCount++ ;
            else
                nonCelCount++; 
        
            while (ss)
            {
                string s;
                if (!getline( ss, s, delimiter )) break;
                record.push_back( s );
            }
            for (int i = 1; i<= record.size()/2;++i)
            {
                s = record[i];
                record[i] = record[record.size() - i];
                record[record.size() - i] = s;
            }
            Original.data.push_back( record );
        }
 
        if (!infile.eof())
        {
            cerr << "Reading file error! \n";
        }
        else
            cout << "Reading file done. \n";
    }
Просто считывает из fname в Original.
в c# подцепляю ее:
C#
1
[DllImport("TestDLL.dll")] public static extern void readDataFromFile(string fname, char delimiter);
Вызываю
C#
1
readDataFromFile(@"C:\\TEMP\\result.txt", ',');
и получаю:
Попытка чтения или записи в защищенную память...
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
05.07.2014, 23:10 9
C++
1
__declspec(dllexport) void readDataFromFile(string fname, char delimiter)
почему string ? да еще по значению

Добавлено через 1 минуту
и вопрос не по теме .
Как бы код обычный, зачем его на С++ писать?
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
05.07.2014, 23:12  [ТС] 10
Это чтение. Там дальше еще распарсивание идет. Просто уже есть реализованная на с++. Надо теперь ее из с# запустить.
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
05.07.2014, 23:15 11
Тоже не по теме Вот такие вещи также чем вы в С# ловить собрались
C++
1
2
3
4
5
6
if (!infile.eof())
{
 cerr << "Reading file error! \n";
}
 else
 cout << "Reading file done. \n";
Добавлено через 2 минуты
Ладно понял , ну строку там исправьте
C++
1
__declspec(dllexport) void readDataFromFile(char*  fname, char delimiter)
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
05.07.2014, 23:17  [ТС] 12
MrCold, ну изначально так и было. а из c# я как ее вызову?)

по поводу
C++
1
2
3
4
5
6
if (!infile.eof())
{
 cerr << "Reading file error! \n";
}
 else
 cout << "Reading file done. \n";
Они чудесно выводятся. До этого писал тестик
C++
1
2
3
4
__declspec(dllexport) void DisplayHelloFromDLL()
  {
    cout << "Hello World" << endl;
  }
И все вывелось)
1
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
05.07.2014, 23:20 13
Лучший ответ Сообщение было отмечено Rabbit13245 как решение

Решение

Цитата Сообщение от Rabbit13245 Посмотреть сообщение
ну изначально так и было. а из c# я как ее вызову?)
у вас все уже написано
C#
1
 public static extern void readDataFromFile(string fname, char delimiter);
1
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
06.07.2014, 00:00  [ТС] 14
MrCold, ахахахахах))) я так специально не писал, думал ругаться будет на несоответствие типов. ахаххахаха

Добавлено через 11 минут
все равно не работает( В итоге работы программы получаю пустой файл. Но если запускать все функции, которые в DLL из обычного проекта c++ то все работает...

Добавлено через 26 минут
Все работает. Просто я не досмотрел кое чего в самом коде функции. Спасибо всем за помощь!
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.07.2014, 05:39 15
Rabbit13245, строки лучше передавать как IntPtr, иначе при компиляции в x64 будет вылетать ошибка. Либо ставить в свойствах проекта жестко "x86"
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
06.07.2014, 11:50  [ТС] 16
Psilon, поставил x86, но все равно ошибка со строками.
в с++ есть функция
C++
1
2
3
4
__declspec(dllexport) void Parse(string clas)
{
тело функции
}
в c# я ее импортирую
C#
1
2
[DllImport("TestDLL.dll")]
    public static extern void Parse(string cl);
и когда вызываю ее, опять получаю исключение про обращение к защищенной памяти...
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
06.07.2014, 12:29 17
Цитата Сообщение от Rabbit13245 Посмотреть сообщение
__declspec(dllexport) void Parse(string clas)
Ну это уже было
Цитата Сообщение от MrCold Посмотреть сообщение
почему string ? да еще по значению
Теоретически можно передать по ссылке std::string
C++
1
 void Parse(std::string &  clas)
возможно это сработает,
если мы принимаем строку из C# в С++ .Но лучше не рисковать и использовать С-стиль.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.07.2014, 14:55 18
Rabbit13245, еще раз, НЕ используйте С++ для экспортируемых функций, НЕ ИСПОЛЬЗУЙТЕ. Все сигнатуры должны содержать только структуры, массивы и примитивные типы. Никаких std, ничего. В лучшем случае можно использовать винапишные LPSTR, но это те же char/wchar_t
0
06.07.2014, 14:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2014, 14:55
Помогаю со студенческими работами здесь

Использование функций из dll, написанной в VS2008, в Python-е
Доброго времени суток, уважаемые знатоки, помогите решить одну проблему. Есть dll написанная на...

Использование DLL написанной на C#
В силу обстоятельств требуется использовать функцию из DLL, написанной на C#. Пишу простенький тест...

C++ импорт функций dll написанной на c#
Здравствуйте, профессионалы! В общем суть вопроса в импорте функций из DLL написанной на C#....

Вызов программой, написанной на С++, функции из dll, написанной на Assembler (явное подключение dll)
Доброго времени суток!Задали лабораторную работу: программа, написанная на с++ должна подключать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru