Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интеграция C++ и C# 
:(
    Опции темы
ClockWork
Дата 14.2.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 14.2.2007

Репутация: нет
Всего: нет





Здравствуйте, люди. Пишу на C# совсем недавно, и только осваиваю эту технологию. Проект совсем малюсинький, но возникла следующая ситуация. Дали мне несколько подпрограмм, написанных на C++.

Вопрос: могу ли использовать их в своем C# проекте или мне придется переводить их на этот язык (C# smile)? Просто много слышал про языковую независимость и стало интересно.

Заранее спасибо за развернутые ответы. ;)
PM MAIL   Вверх
mr.DUDA
Дата 14.2.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Что дали ? Код (.h/.cpp), либрари (.h/.lib), скомпилированный dll ?

Если код, то теоретически можно заюзать C++/CLI, конкретнее можно узнать у других участников форума. Если длл, то экспортируемые функции легко юзаются через [DllImport].


--------------------
user posted image
PM MAIL WWW   Вверх
ClockWork
Дата 14.2.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 14.2.2007

Репутация: нет
Всего: нет



Дали код .h/.c . В нем описаны два метода.. Тока кажись одному из этих методов в качестве параметра надо указатель передавать то  ли функцию, то ли еще на что..

Вот.

Если не сложно - опишите подробенее как добиться этой самой интеграции.

З.Ы. Юзаю VS 2005 (не знаю, может это играет какую роль)..


PM MAIL   Вверх
marcusmae
Дата 14.2.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



1) В один Solution Вы можете включить проекты на C++ и на C#. Попробуйте скомпилить свои программки на C++ с опцией /clr.
2) Если благополучно, то далее, по обстоятельствам. Два варианта.

Первый : изъять из кода адреса, указатели, переключить используемые библиотеки <stdio.h>, ... на эквивалентные из .NET Framework - фактически, это будет означать переписывание Ваших программ с обычного C++ на C++.NET. Чтобы начать использовать код, останется только подключить ссылку на этот C++-ный проект в проект на C#.

Второй : написать managed обёртку unmanaged-классов, которые Вы хотите использовать из C#. Вот пример того, как обёртывать unmanaged-класс, использующий STL :

Код

#include <vcclr.h>
#include <map>
#include <algorithm>
public __gc class MyDotNetClass // ref вместо __gc, если попросит новый синтаксис
{
private:
typedef std::multimap< CString, gcroot<Object*> > ObjectMap; // unmanaged-тип
ObjectMap* m_ObjectMap; // экземпляр unmanaged-типа

public:

// В конструкторе инициализируем экземпляр unmanaged-типа
MyDotNetClass()
: m_ObjectMap( new ObjectMap())
{}

// В деструкторе уничтожаем экземпляр unmanaged-типа
~MyDotNetClass()
{
     delete m_ObjectMap;
}

// дальше, обернём какие-нить функции

void Insert( String* theKey, Object* theObject )
{
    m_ObjectMap->insert( ObjectMap::value_type( theKey,
        theObject ));
}

bool Exists( String* theKey )
{
    return m_ObjectMap->find( theKey ) != m_ObjectMap->end();
}

Object* Find( String* theKey ) []
{
    std::pair< ObjectMap::const_iterator,
    ObjectMap::const_iterator > range;

    range = m_ObjectMap->equal_range( theKey );

    // инициализируем managed-массив в зависиммотси от числа элементов
    Object* result[] = new Object*[ std::distance(
        range.first, range.second ) ];

    // копируем возвращаемые значения в managed-массив
    int i = 0;
    for ( ObjectMap::const_iterator it = range.first; it !=
         range.second; ++it, ++i )
    result[i] = it->second;
    return result;
}
};


Оба варианта в принципе требуют некоторых трудозатрат.

3) Если у Вас не код, а dll (exe) на С, то их функции можно импортировать в C#-ую программу с помощью DllImport :

Код

   public class Сamera
    {
        [DllImport("1394camera.dll", EntryPoint = "?CheckLink@C1394Camera@@QAEHXZ")]
        private static extern int CheckLink();
        public int Anzahl;
        public Сamera()
        {
            Anzahl = CheckLink();
        }
    }


Это сообщение отредактировал(а) marcusmae - 14.2.2007, 16:41


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0430 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.