Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/48: Рейтинг темы: голосов - 48, средняя оценка - 4.56
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
1

Импорт класса из C++ в C#

16.05.2011, 18:18. Показов 9288. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть класс (шаблонный), написанный на С++. Необходимо его импортировать в C#. Я пробовал собирать из C++ класса dll, написав class __declspec( dllexport ) %ClassName%.
При добавлении библиотеки в C# проект VS 2010 выдаёт ошибку:
A reference ... could not be added. Please make sure that the file is accessible, and that it is a valid asse,bly or COM component.
Как исправить данную ошибку?

P.S. Если возможно другие варианты импорта, то они тоже могут быть рассмотрены, как решение
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2011, 18:18
Ответы с готовыми решениями:

Импорт класса из dll
Добрый день! Извиняюсь, если вопрос очень нубский. Обшарил кучу разных материалов, но не нашел...

Импорт класса ошибка
Где здесь ошибка? вот пакет: package samples { public class SampleCode { ...

Импорт С# класса из DLL в С++/CLI
имеется HelloWorld на Шарпе, приведите пожалуйста пример его использования в консольном С++/CLR,...

Импорт класса из другого проекта
Подскажите, пожалуйста, каким образом я могу импортировать класс Java, который был объявлен в...

28
86 / 85 / 13
Регистрация: 21.10.2010
Сообщений: 349
16.05.2011, 21:04 2
Создай сом библиотеку зарегь ее на компе и вызывай из C#
0
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
16.05.2011, 23:35  [ТС] 3
Vangok, можете объяснить, как это сделать или кинуть ссылку на литературу
0
584 / 371 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
17.05.2011, 11:23 4
Цитата Сообщение от Vangok Посмотреть сообщение
Создай сом библиотеку зарегь ее на компе и вызывай из C#
Заколебется писать.

M__A__K, если у тебя VS >2003 то скомпиль свой С++ с опцией /clr - тогда получишь dll которая пристыкуется через AddReference
0
1319 / 992 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
17.05.2011, 12:17 5
Vangok, sigmov, мечтатели))))
M__A__K, выложи сюда сам ++ класс (не больше 20 строк, плиз)
0
155 / 155 / 30
Регистрация: 19.10.2009
Сообщений: 319
17.05.2011, 14:22 6
По мне самый простой способ, чтоб на C++ не мучится с CLR, скомпилировать обычную DLL с def-файлом для Factory, а потом использовать DllImport. Здесь на примере WinAPI подробно описано, как им пользоваться, и приведена таблица соотвествия типов данных C++ и C#.
1
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
17.05.2011, 14:32  [ТС] 7
sigmov, всё равно выдаёт ту же ошибку

вот код:
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
template <class T>
struct Element
{
  int index;
  int value;
  Element<T>* left_element;
  Element<T>* right_element;
  Element<T>* next_element;
  Element<T>* previous_element;
};
 
template <class T>
class __declspec( dllexport ) BinaryTree
{
private:
  Element<T>* top;
  Element<T>* first_element;
  Element<T>* last_element;
  int index_counter;
  //Add for internal operations
  bool Add( Element<T>* new_element );
public:
  BinaryTree();
 
  BinaryTree( const BinaryTree & bt );
 
  bool Add( T new_value );
 
  bool Delete( T deleting_value );
 
  int IndexOf( T searching_value );
 
  BinaryTree<T> Union( const BinaryTree & bt );
 
  BinaryTree<T> Intersect( const BinaryTree & bt );
 
  BinaryTree<T> Except( const BinaryTree & bt );
 
  ~BinaryTree<T>();
 
  //debug
  void Show();
};
строк не 20, но и не 120 + я думаю, будет не лишним для понимания знать, что в за тип данных Element<T>

Ilya81, по подробней, пожалуйста. как
Цитата Сообщение от Ilya81 Посмотреть сообщение
скомпилировать обычную DLL с def-файлом для Factory
?
с DllImport я работал, когда winapi импортировал
0
584 / 371 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
17.05.2011, 14:52 8
Цитата Сообщение от M__A__K Посмотреть сообщение
sigmov, всё равно выдаёт ту же ошибку
Потому что это template классы.
Кстати template классы экспортировать в 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
generic <class T>
ref class Element
{
  int index;
  int value;
  Element<T>^ left_element;
  Element<T>^ right_element;
  Element<T>^ next_element;
  Element<T>^ previous_element;
};
 
generic <class T>
ref class BinaryTree
{
private:
  Element<T>^ top;
  Element<T>^ first_element;
  Element<T>^ last_element;
  int index_counter;
  virtual  bool Add(Element<T>^ new_element) = 0;
public:
  //BinaryTree();
  //BinaryTree(BinaryTree<T>^ bt ) = 0;
  virtual bool Add(T new_value ) = 0;
  virtual bool Delete(T deleting_value ) = 0;
  virtual int IndexOf(T searching_value ) = 0;
  virtual BinaryTree<T>^ Union(BinaryTree<T>^ bt ) = 0;
  virtual BinaryTree<T>^ Intersect(BinaryTree<T>^ bt ) = 0;
  virtual BinaryTree<T>^ Except(BinaryTree<T>^ bt ) = 0;
  virtual void Show() = 0;
};
Добавлено через 4 минуты
Кстати очень интересно, а что же делает чтлен Element<T>^ next_element в бинарном узле )))))
0
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
17.05.2011, 15:04  [ТС] 9
Цитата Сообщение от sigmov Посмотреть сообщение
Кстати очень интересно, а что же делает чтлен Element<T>* next_element в бинарном узле )))))
у меня получается двойная организация: бинарное дерево и список. там ещё Element<T>* previous_element есть

Цитата Сообщение от sigmov Посмотреть сообщение
Кстати template классы экспортировать в dll невозможно впринципе.
что, вообще никак?
0
155 / 155 / 30
Регистрация: 19.10.2009
Сообщений: 319
17.05.2011, 15:05 10
Цитата Сообщение от M__A__K Посмотреть сообщение
Ilya81, по подробней, пожалуйста. как
Я думал возвращать класс как результат вызова функции, но если я тут вижу template, боюсь, это не получится, я сильно сомневаюсь, что template в принципе можно использовать в .Net. Вероятно, этот С++ нужно как-то переделывать...
0
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
17.05.2011, 15:16  [ТС] 11
Цитата Сообщение от Ilya81 Посмотреть сообщение
я сильно сомневаюсь, что template в принципе можно использовать в .Net
но в .NET есть же такие структуры данных как List<>, Array<> и др. из System.Collections.Generic. они то как-то реализованы...

Добавлено через 5 минут
sigmov, что вы хотели сказать приведенным кодом? это мне необходимо заменить мой код на ваш, чтобы получилось? и что за операция ^?
0
584 / 371 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
17.05.2011, 15:21 12
Цитата Сообщение от M__A__K Посмотреть сообщение
у меня получается двойная организация: бинарное дерево и список. там ещё Element<T>* previous_element есть
А понятно. Скрещиваете кроликов с удавами....
Цитата Сообщение от M__A__K Посмотреть сообщение
что, вообще никак?
Абсолютно. DLL - это бинарный модуль. А Template аппроксимацию в бинанрный модуль никак не засунешь.
Все Template строго идентифицируются на этапе компиляции.

Generic - несколько иная вещь. За счет двуфазности компиляции сборок в NET, Generic строко идентифицируется лишь на этапе JIT компиляции. Что позволяет "упихать" Generic в сборку(которую некоторые именуют dll, хотя это не совсем так).
Однако сие накладывает ограничения на использование самих вариантных типов - среда должна что они умеют еще на первой фазе компиляции.

Добавлено через 2 минуты
Цитата Сообщение от M__A__K Посмотреть сообщение
но в .NET есть же такие структуры данных как List<>, Array<> и др. из System.Collections.Generic. они то как-то реализованы...
Через Generic, не Template

Цитата Сообщение от M__A__K Посмотреть сообщение
Добавлено через 5 минут
sigmov, что вы хотели сказать приведенным кодом? это мне необходимо заменить мой код на ваш, чтобы получилось? и что за операция ^?
1) Как это выглядит на MC++
2) Да
3) Обозначение управляемой ссылки(указателя)

P.S. Хотя на самом деле, сильно не понимаю, зачем так извращаться с С++, ечли все это есть в исходниках на C#
0
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
17.05.2011, 15:39  [ТС] 13
Цитата Сообщение от sigmov Посмотреть сообщение
P.S. Хотя на самом деле, сильно не понимаю, зачем так извращаться с С++, ечли все это есть в исходниках на C#
я сравниваю быстродействие различных структур данных, предназначенных для хранения множеств. в качестве тестируемых структур использую парочку из System.Collections.Generic, обыкновенный массив и бинарное дерево (точнее кролико-удавного гибрида). Реализация бинарного дерева делается собственноручно т.к. доступ к внутренней структуре должен дать большее быстродействие. а именно на с++ я данную структуру данных реализовываю, т.к. там сплошная работа с указателями, а данный вид работы удобней выполнять именно на с++

Добавлено через 1 минуту
Цитата Сообщение от sigmov Посмотреть сообщение
Абсолютно. DLL - это бинарный модуль.
использование именно dll непринципиально. моя цель - импортировать данный класс в c# код.

Добавлено через 6 минут
sigmov, по коду:
1) конструкторы за комментированы. как без конструкторов то?
2) virtual ... = 0; это вы так определяете пустую функцию абстрактного класса, чьё объявление должно быть в дочернем классе? просто у меня BinaryTree не абстрактный класс, я просто не стал выкладывать объявление. если нужно, могу выложить
0
584 / 371 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
17.05.2011, 15:56 14
Цитата Сообщение от M__A__K Посмотреть сообщение
я сравниваю быстродействие различных структур данных, предназначенных для хранения множеств. в качестве тестируемых структур использую парочку из System.Collections.Generic, обыкновенный массив и бинарное дерево (точнее кролико-удавного гибрида). Реализация бинарного дерева делается собственноручно т.к. доступ к внутренней структуре должен дать большее быстродействие. а именно на с++ я данную структуру данных реализовываю, т.к. там сплошная работа с указателями, а данный вид работы удобней выполнять именно на с++
1. Вас ждет "сюрприз" - родные коллекции(System.Collections.Generic) все равно будут быстрее.
2. В С# любой класс - это тот же самый указатель(ссылка), только более продвинутый - за освобождением памяти следить не надо.

использование именно dll непринципиально. моя цель - импортировать данный класс в c# код.
Тогда пиши сразу на C#

1) конструкторы за комментированы. как без конструкторов то?
2) virtual ... = 0; это вы так определяете пустую функцию абстрактного класса, чьё объявление должно быть в дочернем классе? просто у меня BinaryTree не абстрактный класс, я просто не стал выкладывать объявление. если нужно, могу выложить
1. А ты их сам раскомментируй и переопредели.
2. Да мне то зачем? - просто убери virtual и подставь тела своих функций
0
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
17.05.2011, 16:03  [ТС] 15
Цитата Сообщение от sigmov Посмотреть сообщение
1. Вас ждет "сюрприз" - родные коллекции(System.Collections.Generic) все равно будут быстрее.
тут же ещё зависит от самой структуры данных.

Цитата Сообщение от sigmov Посмотреть сообщение
Тогда пиши сразу на C#
скорее всего так и сделаю, т.к. проблемы с импортом оказались больше, чем ожидаемые трудности с работой с указателями в шарпе.
так что ждите вопросов про указатели
0
584 / 371 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
17.05.2011, 16:16 16
Цитата Сообщение от M__A__K Посмотреть сообщение
скорее всего так и сделаю, т.к. проблемы с импортом оказались больше, чем ожидаемые трудности с работой с указателями в шарпе.
так что ждите вопросов про указатели
Я даже сам задам Вам вопрос: какие же проблемы при работе с ссылками(указателями) в Шарпе?
А то может я что-то упустил в своей жизни..... ))))

Добавлено через 5 минут
Мое Бинарное дерево
0
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
17.05.2011, 16:48  [ТС] 17
Цитата Сообщение от sigmov Посмотреть сообщение
Я даже сам задам Вам вопрос: какие же проблемы при работе с ссылками(указателями) в Шарпе?
конкретно сказать не могу, но помнится там были какие-то замуты при работе с указателями на структуры

на счёт вашего дерева:
- нет удаления элемента
- нет индексации, т.е. при поиске нельзя вывести индекс
ну и нет нужных мне операции над множествами а именно пересечение, объединение и вычитание
0
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
20.05.2011, 22:55  [ТС] 18
sigmov,
C++
1
2
3
4
5
6
7
8
9
struct Element<T>
{
  int index;
  T value;
  Element<T>* left_element;
  Element<T>* right_element;
  Element<T>* next_element;
  Element<T>* previous_element;
};
при переносе на C#, компилятор ругается. говорит, что не может создать указатель на структуру Element<T>, т.к. не знает её размеров
как с этим бороться?
0
1319 / 992 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
20.05.2011, 23:18 19
вспомнился анекдот про "но у вас ничего не выйдет"...
C#
1
2
3
4
5
6
7
8
9
public class Element<T>
{
  public int Index { get; set; }
  public T Value { get; set; }
  public Element<T> LeftElement { get; set; }
  public Element<T> RightElement { get; set; }
  public Element<T> NextElement { get; set; }
  public Element<T> PreviousElement { get; set; }
};
0
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
20.05.2011, 23:24  [ТС] 20
Mikant, дело в том, что мне необходимо, чтобы left_element, right_element, next_element, previous_element были именно указателями. а в предложенном вами варианте данные элементы являются обыкновенными переменными
0
20.05.2011, 23:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2011, 23:24
Помогаю со студенческими работами здесь

Импорт класса из другого файла
Кароче Мне необходимо прописать действие при нажатии кнопки. Интерфейс сделал в QtDesigner, файл...

Как сделать импорт класса?
Ситуация такая: Есть Class1 он лежит в package1.package2.Class1 Есть Class2 он лежит в Root т.е....

Импорт элементов класса в программу
Имеется созданная библиотека, включающая небольшой класс, как правильно реализовать доступ в...

Импорт статических методов класса Math.
Хочу импортировать методы и писать так: double n = sqrt(4.0); Делаю: package test; //import...


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

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