Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
AlexSun
18 / 16 / 1
Регистрация: 03.11.2010
Сообщений: 169
#1

Превратить консольное приложение на C++ в DLL для использования в C# - C++

12.11.2012, 17:51. Просмотров 1620. Ответов 28
Метки нет (Все метки)

Есть довольно крупное консольное приложение - несколько классов, десятки методов.
Оно принимает с клавиатуры вначале некие параметры и потом в цикле выводит результаты (количество итераций задается).
Мне нужны эти результаты в приложении на C#.

Как сделать из него динамическую библиотеку? Как организовать этот ввод параметров и вывод результата? (последовательность байт, около 2000)
Изменять тип выходного файла и импортировать у себя в приложении я умею.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2012, 17:51
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Превратить консольное приложение на C++ в DLL для использования в C# (C++):

Консольное приложение C++ без использования vcredist - C++
Доброго времени суток! Написал маленькую программулинку в VS2012, но для запуска на старых машинах она требует vcredist 2012. Возможно...

Подправить консольное приложение работы с dll - C++
Доброго, форумчане! пытаюсь сделать консольное приложение при запуске ей можно указывать путь к подключаемой dll/указать имя...

Как из проекта .dll сделать консольное приложение? - C++
Всем привет еще раз, У меня есть еще один вопрос. Пусть я создал новый проект, типа Win32 .dll, а потом решил переделать его и сделать...

Создал первое консольное приложение. Выдает ошибка msvcp140.dll и кириллица слетает - C++
Насколько я понимаю не хватает dll на пк где НЕ установлена VS2017 Вопрос как вложить эти файлы в исходник и почему кодировка не...

Консольное приложение для тестирования. - C++
Добрый день! Получил задание разработать консольное приложение для тестирования, на основе готовых тестов. Тест представляет собой...

Создать консольное приложение на С/С++ для обработки и печати текста - C++
Создать приложение которое бы -обрабатывала текст -печатала весь текст -печать файла ***печать всех слов содержащих букву А ...

28
MrCold
859 / 757 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
12.11.2012, 19:32 #2
Вот тема замечательная .Но вопроса конкретного нету ....

Не по теме:


Как бы сам поступил:

Поправил бы , Обернул или Переписал бы на CLI . А потом скомпилировал с флагом / clr .
Тогда достаточно эту DLL-ку подключить к проекту на С#и не придется DLL импортом страдать
Ну эт так мысли в слух .
Вам такой вариант вряд ли подойдет ....

0
AlexSun
18 / 16 / 1
Регистрация: 03.11.2010
Сообщений: 169
12.11.2012, 22:07  [ТС] #3

Конкретный вопрос. Сейчас у меня в консольном приложении в функции main такой код:
C++
1
2
Ocean* myOcean = new Ocean;
myOcean->initialize(24,70,10,10,10);
В программе на C# мне нужно будет сделать это же самое.
Как это делать, как создать myOcean типа Ocean* (или это оставить здесь в dll в глобальной области?) и вызвать initialize?
0
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
13.11.2012, 00:33 #4
Насколько я понимаю, dll это процедурное программирование в чистом виде. Имею ввиду использование:
C++
1
2
3
функция (параметры);
функция (параметры);
функция (параметры);
То есть все функции класса Ocean становятся внешними, а сам класс поэтому превращается в структуру.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifdef BUILD_DLL
   // the dll exports
   #define EXPORT __declspec(dllexport)
#else
   // the exe imports
   #define EXPORT __declspec(dllimport)
#endif
 
struct Ocean {
 int a, b, c, d, e;
};
 
EXPORT void initialize (Ocean*, int, int, int, int, int);
C++
1
2
3
4
5
6
7
8
9
/*A.cpp*/
#include "A.h"
EXPORT void initialize (Ocean* myOcean, int a, int b, int c, int d, int e) {
 myOcean->a= a;
 myOcean->b= b;
 myOcean->c= c;
 myOcean->d= d;
 myOcean->e= e;
}
C++
1
2
3
4
5
6
7
8
9
10
11
#include <windows.h>
#include <stdio.h>
#include "A.h" 
 
int main (){
 Ocean* myOcean= new Ocean;
 initialize (myOcean, 24,70,10,10,10); 
 printf ("+++ %d\n", myOcean->a);
 getchar ();
 return (0);
}
Компилить dll:
C++
1
2
g++ -c -DBUILD_DLL A.cpp
g++ -shared -o A.dll -Wl,--out-implib,libAdll.a A.o
Компилить exe:
C++
1
2
g++ -c B.cpp
g++ -o B.exe B.o -L./ -lAdll
может я в чём-то неправ
1
AlexSun
18 / 16 / 1
Регистрация: 03.11.2010
Сообщений: 169
13.11.2012, 00:46  [ТС] #5
Что-то я сомневаюсь что класс превращается в структуру. В таком случае вся ООП логика моей программы идет к черту.
Как создать namespace, в котором будут все мои классы и методы?
Например:
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
#ifndef RandomDefined
#define RandomDefined
 
namespace OceanDll {
 
class Random
{
private:
    int seed1, seed2;
 
public:
    void initialize(void)
    {
        seed1 = 3797;
        seed2 = 2117;
    }
 
    void init(int s1, int s2)
    {
        seed1 = s1;
        seed2 = s2;
    }
 
    // методы доступа
    float randReal(void);
    unsigned nextIntBetween(int low, int high);
};
}
#endif
Так не работает.
Собрал DLL, не могу ее подключить ибо нету пространства имен.
0
ValeryS
Модератор
6959 / 5296 / 522
Регистрация: 14.02.2011
Сообщений: 17,855
13.11.2012, 00:53 #6
могу предложить тебе следующий вариант
программа на шарпе вызывает программу на плюсах
та в свою очередь выдает свои данные не на экран а в файл(можно файл проецируемый в память)
а шарповая программа считывает эти данные и использует как нужно
0
AlexSun
18 / 16 / 1
Регистрация: 03.11.2010
Сообщений: 169
13.11.2012, 00:55  [ТС] #7
ValeryS, думал над таким вариантом - много лишних действий.
0
ValeryS
Модератор
6959 / 5296 / 522
Регистрация: 14.02.2011
Сообщений: 17,855
13.11.2012, 01:00 #8
Цитата Сообщение от AlexSun Посмотреть сообщение
Что-то я сомневаюсь что класс превращается в структуру.
не превращается если явно не задашь компилировать как С
но тогда твои функции из понятных имен будут зашифрованы по соглашению плюсов
вообще длл проще писать с нуля, используя наработанный код

Добавлено через 3 минуты
Цитата Сообщение от AlexSun Посмотреть сообщение
думал над таким вариантом - много лишних действий.
каких???
Цитата Сообщение от AlexSun Посмотреть сообщение
Оно принимает с клавиатуры вначале некие параметры и потом в цикле выводит результаты (количество итераций задается).
один файл на ввод другой на вывод

по крайней мере у тебя отлаженная программа и будет работать, а при написании длл тебе все придется писать тестировать заново
можно ведь сделать такой вариант а потом не торопясь написать длл
0
AlexSun
18 / 16 / 1
Регистрация: 03.11.2010
Сообщений: 169
13.11.2012, 01:01  [ТС] #9
Я собрал DLL, импортировал добавил ее как ссылку в C#, пишу using Ocean и выдается ошибка мол это тип, а не пространство имен. Как это пространство имен создать?
В заголовочных файлах взял весь код в namespace OceanDll {}, в исполняемых везде написал using namespace OceanDll - получил пол тысячи ошибок.
0
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
13.11.2012, 01:02 #10
Что-то я сомневаюсь что класс превращается в структуру. В таком случае вся ООП логика моей программы идет к черту.
Ну он может и не превращаться в структуру, он может остаться классом, дело ведь не в этом. Дело в том, что ты не сможешь использовать функции-методы, которые определены в dll. Они должны быть в исходниках.
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.11.2012, 01:02 #11
Цитата Сообщение от AlexSun Посмотреть сообщение
Как создать namespace, в котором будут все мои классы и методы?
о каком неймспейсе в нативной длл может идти речь? в с++ нет и не было рефлексии
идите читать матчасть
без привязки к специфическим технологиям максимум вы можете импортировать функцию с примитивными параметрами
с приязкой к COM можно импортиировать и комопнентыклассы но это очень геморно
0
AlexSun
18 / 16 / 1
Регистрация: 03.11.2010
Сообщений: 169
13.11.2012, 01:06  [ТС] #12
ValeryS, уже никакого в/в нету, есть только пара функций и переменных к которым мне нужен доступ из C#.

Добавлено через 2 минуты
Блин. Задача сводится к следующему - есть куча кода на C++, он ничего не вводит и не выводит в консоль. Мне нужно склеить из всего этого DLL и подключить ее в C#, чтоб использовать оттуда 2 метода, которые будут принимать аргументы и возвращать массивы... Это не возможно что ли?

Добавлено через 1 минуту
Цитата Сообщение от Jupiter Посмотреть сообщение
о каком неймспейсе в нативной длл может идти речь? в с++ нет и не было рефлексии
идите читать матчасть
http://msdn.microsoft.com/ru-ru/library/ms235636.aspx - здесь есть namespace?
Нету времени читать матчасть
0
ValeryS
Модератор
6959 / 5296 / 522
Регистрация: 14.02.2011
Сообщений: 17,855
13.11.2012, 01:10 #13
посмотри здесь
Visual Studio 2010 подключение DLL(C++) к проекту на C#
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.11.2012, 01:11 #14
AlexSun, там есть, но как вы не понимаете что dll это бинарный файл и нативная dll не содержит никакой информации о классах, структурах и неймспейсах потому что в С++ нет рефлексии!!!

Кристиан Нейгел .NET для профессионалов - взаимодействие .NET и COM - там есть пример импорта COM-компонентакласса, но для этого нужно как минимум заточить свой код под COM
0
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
13.11.2012, 01:11 #15
подключить ее в C#
Тогда я по-другому спрошу; ты когда в С# создаёшь объект какого-то класса, ты же подключаешь какой-то хидер? Ты же не обходишься голой dll, а подключаешь хидер. dll-ки вообще незнакомы ни с какими именами, кроме имён функций и других dll-ок, даже с именами встроенных типов, а ты хочешь чтобы они распознали твой тип!
0
13.11.2012, 01:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2012, 01:11
Привет! Вот еще темы с ответами:

Создать консольное приложение для учета прописанных в доме жителей - C++
Создать консольное приложение для учета прописанных в доме жителей. С консоли должны считываться команды: “init n” – где n – целое...

Какое консольное mini-приложение можно сделать с использованием классов (для практики)? - C++
Подскажите пожалуйста какое то консольное mini-приложение можно сделать с использованием классов. А то книгу читаю но все бистро забивается...

консольное приложение (при запуске приложение открывалось на весь экран) - C++
Как сделать, чтобы при запуске приложение открывалось на весь экран?

Написать dll для дальнейшего использования в программах на других языках - C++
как правильно написать dll чтоб ей можно было пользоваться программам на других языках, например, на delphi


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru