Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
AlexSun
16 / 14 / 1
Регистрация: 03.11.2010
Сообщений: 169
12.11.2012, 17:51     Превратить консольное приложение на C++ в DLL для использования в C# #1
Есть довольно крупное консольное приложение - несколько классов, десятки методов.
Оно принимает с клавиатуры вначале некие параметры и потом в цикле выводит результаты (количество итераций задается).
Мне нужны эти результаты в приложении на C#.

Как сделать из него динамическую библиотеку? Как организовать этот ввод параметров и вывод результата? (последовательность байт, около 2000)
Изменять тип выходного файла и импортировать у себя в приложении я умею.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
12.11.2012, 19:32     Превратить консольное приложение на C++ в DLL для использования в C# #2
Вот тема замечательная .Но вопроса конкретного нету ....

Не по теме:


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

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

AlexSun
16 / 14 / 1
Регистрация: 03.11.2010
Сообщений: 169
12.11.2012, 22:07  [ТС]     Превратить консольное приложение на C++ в DLL для использования в C# #3

Конкретный вопрос. Сейчас у меня в консольном приложении в функции main такой код:
C++
1
2
Ocean* myOcean = new Ocean;
myOcean->initialize(24,70,10,10,10);
В программе на C# мне нужно будет сделать это же самое.
Как это делать, как создать myOcean типа Ocean* (или это оставить здесь в dll в глобальной области?) и вызвать initialize?
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
13.11.2012, 00:33     Превратить консольное приложение на C++ в DLL для использования в C# #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
может я в чём-то неправ
AlexSun
16 / 14 / 1
Регистрация: 03.11.2010
Сообщений: 169
13.11.2012, 00:46  [ТС]     Превратить консольное приложение на C++ в DLL для использования в C# #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, не могу ее подключить ибо нету пространства имен.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
13.11.2012, 00:53     Превратить консольное приложение на C++ в DLL для использования в C# #6
могу предложить тебе следующий вариант
программа на шарпе вызывает программу на плюсах
та в свою очередь выдает свои данные не на экран а в файл(можно файл проецируемый в память)
а шарповая программа считывает эти данные и использует как нужно
AlexSun
16 / 14 / 1
Регистрация: 03.11.2010
Сообщений: 169
13.11.2012, 00:55  [ТС]     Превратить консольное приложение на C++ в DLL для использования в C# #7
ValeryS, думал над таким вариантом - много лишних действий.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
13.11.2012, 01:00     Превратить консольное приложение на C++ в DLL для использования в C# #8
Цитата Сообщение от AlexSun Посмотреть сообщение
Что-то я сомневаюсь что класс превращается в структуру.
не превращается если явно не задашь компилировать как С
но тогда твои функции из понятных имен будут зашифрованы по соглашению плюсов
вообще длл проще писать с нуля, используя наработанный код

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

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

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

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

Кристиан Нейгел .NET для профессионалов - взаимодействие .NET и COM - там есть пример импорта COM-компонентакласса, но для этого нужно как минимум заточить свой код под COM
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
13.11.2012, 01:11     Превратить консольное приложение на C++ в DLL для использования в C# #15
подключить ее в C#
Тогда я по-другому спрошу; ты когда в С# создаёшь объект какого-то класса, ты же подключаешь какой-то хидер? Ты же не обходишься голой dll, а подключаешь хидер. dll-ки вообще незнакомы ни с какими именами, кроме имён функций и других dll-ок, даже с именами встроенных типов, а ты хочешь чтобы они распознали твой тип!
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
13.11.2012, 01:12     Превратить консольное приложение на C++ в DLL для использования в C# #16
и здесь
http://msdn.microsoft.com/en-us/library/aa288468
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.11.2012, 01:14     Превратить консольное приложение на C++ в DLL для использования в C# #17
Цитата Сообщение от kravam Посмотреть сообщение
Тогда я по-другому спрошу; ты когда в С# создаёшь объект какого-то класса, ты же подключаешь какой-то хидер?
с каких пор в шарпе можно подклюать сишные хедеры!?
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
13.11.2012, 01:16     Превратить консольное приложение на C++ в DLL для использования в C# #18
Цитата Сообщение от Jupiter Посмотреть сообщение
AlexSun, там есть, но как вы не понимаете что dll это бинарный файл и нативная dll не содержит никакой информации о классах, структурах и неймспейсах потому что в С++ нет рефлексии!!!
сщас еще
все функции лежат в export dll
и если не использовать extern C то в имени функции зашифрованы и имя и класс и количество и тип параметров
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
13.11.2012, 01:17     Превратить консольное приложение на C++ в DLL для использования в C# #19
Цитата Сообщение от Jupiter Посмотреть сообщение
с каких пор в шарпе можно подклюать сишные хедеры!?
кто-то сказал сишные? Я не говорил
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2012, 01:17     Превратить консольное приложение на C++ в DLL для использования в C#
Еще ссылки по теме:

Какое консольное mini-приложение можно сделать с использованием классов (для практики)? C++
C++ Консольное приложение C++ без использования vcredist
Создать консольное приложение на С/С++ для обработки и печати текста C++

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.11.2012, 01:17     Превратить консольное приложение на C++ в DLL для использования в C# #20

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
сщас еще
все функции лежат в export dll
и если не использовать extern C то в имени функции зашифрованы и имя и класс и количество и тип параметров
в моей цитате есть хоть слово про функции?


Цитата Сообщение от kravam Посмотреть сообщение
кто-то сказал сишные? Я не говорил
тогда о каких хедерах речь?
Yandex
Объявления
13.11.2012, 01:17     Превратить консольное приложение на C++ в DLL для использования в C#
Ответ Создать тему
Опции темы

Текущее время: 10:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru