23 / 21 / 4
Регистрация: 03.11.2010
Сообщений: 169
1

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

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

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

Как сделать из него динамическую библиотеку? Как организовать этот ввод параметров и вывод результата? (последовательность байт, около 2000)
Изменять тип выходного файла и импортировать у себя в приложении я умею.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2012, 17:51
Ответы с готовыми решениями:

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

Граф. приложение+библиотеки+консольное приложение! Не работает программа без использования консоли. Если использую, то всё прекрасно работает.
Ребята нужна помощь,все вроде сделал, но приложение начинает зависать при запуске без использования...

Консольное приложение + объединение с DLL
Доброго времени суток. Не судите меня за такую тему, их уже сотни, но ни в одной я разобраться не...

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

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

Не по теме:


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

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

0
23 / 21 / 4
Регистрация: 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
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
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
23 / 21 / 4
Регистрация: 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
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
13.11.2012, 00:53 6
могу предложить тебе следующий вариант
программа на шарпе вызывает программу на плюсах
та в свою очередь выдает свои данные не на экран а в файл(можно файл проецируемый в память)
а шарповая программа считывает эти данные и использует как нужно
0
23 / 21 / 4
Регистрация: 03.11.2010
Сообщений: 169
13.11.2012, 00:55  [ТС] 7
ValeryS, думал над таким вариантом - много лишних действий.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
13.11.2012, 01:00 8
Цитата Сообщение от AlexSun Посмотреть сообщение
Что-то я сомневаюсь что класс превращается в структуру.
не превращается если явно не задашь компилировать как С
но тогда твои функции из понятных имен будут зашифрованы по соглашению плюсов
вообще длл проще писать с нуля, используя наработанный код

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

по крайней мере у тебя отлаженная программа и будет работать, а при написании длл тебе все придется писать тестировать заново
можно ведь сделать такой вариант а потом не торопясь написать длл
0
23 / 21 / 4
Регистрация: 03.11.2010
Сообщений: 169
13.11.2012, 01:01  [ТС] 9
Я собрал DLL, импортировал добавил ее как ссылку в C#, пишу using Ocean и выдается ошибка мол это тип, а не пространство имен. Как это пространство имен создать?
В заголовочных файлах взял весь код в namespace OceanDll {}, в исполняемых везде написал using namespace OceanDll - получил пол тысячи ошибок.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.11.2012, 01:02 10
Что-то я сомневаюсь что класс превращается в структуру. В таком случае вся ООП логика моей программы идет к черту.
Ну он может и не превращаться в структуру, он может остаться классом, дело ведь не в этом. Дело в том, что ты не сможешь использовать функции-методы, которые определены в dll. Они должны быть в исходниках.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.11.2012, 01:02 11
Цитата Сообщение от AlexSun Посмотреть сообщение
Как создать namespace, в котором будут все мои классы и методы?
о каком неймспейсе в нативной длл может идти речь? в с++ нет и не было рефлексии
идите читать матчасть
без привязки к специфическим технологиям максимум вы можете импортировать функцию с примитивными параметрами
с приязкой к COM можно импортиировать и комопнентыклассы но это очень геморно
0
23 / 21 / 4
Регистрация: 03.11.2010
Сообщений: 169
13.11.2012, 01:06  [ТС] 12
ValeryS, уже никакого в/в нету, есть только пара функций и переменных к которым мне нужен доступ из C#.

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

Добавлено через 1 минуту
Цитата Сообщение от Jupiter Посмотреть сообщение
о каком неймспейсе в нативной длл может идти речь? в с++ нет и не было рефлексии
идите читать матчасть
http://msdn.microsoft.com/ru-r... 35636.aspx - здесь есть namespace?
Нету времени читать матчасть
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
13.11.2012, 01:10 13
посмотри здесь
Visual Studio 2010 подключение DLL(C++) к проекту на C#
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.11.2012, 01:11 14
AlexSun, там есть, но как вы не понимаете что dll это бинарный файл и нативная dll не содержит никакой информации о классах, структурах и неймспейсах потому что в С++ нет рефлексии!!!

Кристиан Нейгел .NET для профессионалов - взаимодействие .NET и COM - там есть пример импорта COM-компонентакласса, но для этого нужно как минимум заточить свой код под COM
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.11.2012, 01:11 15
подключить ее в C#
Тогда я по-другому спрошу; ты когда в С# создаёшь объект какого-то класса, ты же подключаешь какой-то хидер? Ты же не обходишься голой dll, а подключаешь хидер. dll-ки вообще незнакомы ни с какими именами, кроме имён функций и других dll-ок, даже с именами встроенных типов, а ты хочешь чтобы они распознали твой тип!
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
13.11.2012, 01:12 16
и здесь
http://msdn.microsoft.com/en-us/library/aa288468
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.11.2012, 01:14 17
Цитата Сообщение от kravam Посмотреть сообщение
Тогда я по-другому спрошу; ты когда в С# создаёшь объект какого-то класса, ты же подключаешь какой-то хидер?
с каких пор в шарпе можно подклюать сишные хедеры!?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
13.11.2012, 01:16 18
Цитата Сообщение от Jupiter Посмотреть сообщение
AlexSun, там есть, но как вы не понимаете что dll это бинарный файл и нативная dll не содержит никакой информации о классах, структурах и неймспейсах потому что в С++ нет рефлексии!!!
сщас еще
все функции лежат в export dll
и если не использовать extern C то в имени функции зашифрованы и имя и класс и количество и тип параметров
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.11.2012, 01:17 19
Цитата Сообщение от Jupiter Посмотреть сообщение
с каких пор в шарпе можно подклюать сишные хедеры!?
кто-то сказал сишные? Я не говорил
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.11.2012, 01:17 20

Не по теме:

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


Цитата Сообщение от kravam Посмотреть сообщение
кто-то сказал сишные? Я не говорил
тогда о каких хедерах речь?
0
13.11.2012, 01:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2012, 01:17
Помогаю со студенческими работами здесь

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

Просто консольное приложение требует dll на Винде
Здравствуйте, Собрал простенькое консольное приложение, на компах, где установлен VS2017 все...

Создать консольное .NET приложение использующее описанный DLL-модуль
Разработать и реализовать на платформе Microsoft .NET (используя язык программирования C#, VB.NET...

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

Как открыть консольное приложение в .NET через другое консольное приложение .NET
Есть один вопрос. Как открыть консольное приложение .NET через другое консольное приложение .NET,...

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


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

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

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