Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Неуправляемый класс в MC++


Автор: Plamenk 18.10.2005, 16:32
Всем Привет!

У меня есть .ccp и .h файлы класса написанного на обычном С++. И мне надо сделать библиотеку на MC++ с классом оберткой для этого класса. Как это сделать ума не приложу! Пытался использовать класс как private переменную MC++ класса, но компилятор ругается.

Заранее Всем Большое СПАСИБО!

Автор: Exception 21.10.2005, 17:54
ну.. а почему не выходит? эксепшны? какие?

Автор: Budda 23.10.2005, 20:17
Plamenk: сейчас воюю с аналогичной проблемой. Насколько я вник, тебе нужно сделать класс-обёртку, напр. CMyLayer. Обязательно сделать его public и gc. После этого, объяви в нём закрытый объект того типа (класса) (COld), который тебе нужно извлечь из старого проекта. И для каждой нужной функции из COld, которую ты хочешь использовать в C# пиши новую функцию в CMyLayer.

Т.е. допустим есть:
Код


class COld
{
priveate:
int a;
public:
int GetA();
}

public __gc class CMyLayer{
private:
COld m_old;
public:
int GetA(){m_old.GetA();};
}


Вроде так нужно делать. Если я не прав, поправьте, плиз, мне тоже будет полезно

Автор: Plamenk 24.10.2005, 07:56
2 Budda

Именно так я и сделал, но компилятор вывел мне ошибки следующего типа:

Код

c:\documents and settings\alexy\мои документы\visual studio projects\searchengine\searchengine\SearchEngine.h(18): error C3633: cannot define 'm_Sacner' as a member of managed 'Searcher'
c:\documents and settings\alexy\мои документы\visual studio projects\searchengine\searchengine\SearchEngine.h(18): error C3633: cannot define 'm_Sacner' as a member of managed 'Searcher'
        because of the presence of copy constructor 'std::list<_Ty>::__ctor' on class 'std::list<_Ty>'
        with
        [
            _Ty=SIZE_T
        ]
        and
        [
            _Ty=SIZE_T
        ]
        and
        [
            _Ty=SIZE_T
        ]
        C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\list(308) : see declaration of 'std::list<_Ty>::__ctor'
        with
        [
            _Ty=SIZE_T
        ]
        and
        [
            _Ty=SIZE_T
        ]
c:\documents and settings\alexy\мои документы\visual studio projects\searchengine\searchengine\SearchEngine.h(18): error C3633: cannot define 'm_Sacner' as a member of managed 'Searcher'
        because of the presence of assignment operator 'std::list<_Ty>::operator`='' on class 'std::list<_Ty>'
        with
        [
            _Ty=SIZE_T
        ]
        and
        [
            _Ty=SIZE_T
        ]
        C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\list(368) : see declaration of 'std::list<_Ty>::operator`=''
        with
        [
            _Ty=SIZE_T
        ]
c:\documents and settings\alexy\мои документы\visual studio projects\searchengine\searchengine\SearchEngine.h(18): error C3633: cannot define 'm_Sacner' as a member of managed 'Searcher'
        because of the presence of destructor 'std::list<_Ty>::~list' on class 'std::list<_Ty>'
        with
        [
            _Ty=SIZE_T
        ]
        and
        [
            _Ty=SIZE_T
        ]
        and
        [
            _Ty=SIZE_T
        ]
        C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\list(363) : see declaration of 'std::list<_Ty>::~list'
        with
        [
            _Ty=SIZE_T
        ]
        and
        [
            _Ty=SIZE_T
        ]
c:\documents and settings\alexy\мои документы\visual studio projects\searchengine\searchengine\SearchEngine.h(18): error C3633: cannot define 'm_Sacner' as a member of managed 'Searcher'
        because of the presence of destructor 'CMemScaner::~CMemScaner' on class 'CMemScaner'
        c:\documents and settings\alexy\мои документы\visual studio projects\searchengine\searchengine\memscaner.h(25) : see declaration of 'CMemScaner::~CMemScaner'
        c:\documents and settings\alexy\мои документы\visual studio projects\searchengine\searchengine\memscaner.h(9) : see declaration of 'CMemScaner'

Автор: Plamenk 24.10.2005, 09:43
Такие ошибки выдаются, если у меня код следующего типа:

Код

public __gc class Searcher    {

    private:
        CScaner m_Sacner;

    public:
        Searcher(int ID):m_Sacner(ID)
        {}

    };


А если переписать вот так:


Код

public __gc class Searcher    {

    private:
        CScaner* m_Sacner;

    public:
        Searcher(int ID)
        {
            m_Sacner = new CScaner(ID);
        }
    };


То выдаются следующие ошибки:

Код

SearchEngine error LNK2020: unresolved token (0A000013) exception.__ctor
SearchEngine error LNK2020: unresolved token (0A00001C) ??_7type_info@@6B@
SearchEngine error LNK2020: unresolved token (0A000027) exception.__dtor
SearchEngine fatal error LNK1120: 3 unresolved externals

Автор: Budda 24.10.2005, 10:25
Думаю, что лучше юзать конструкцию второго типа.

"__ctor" и ".__dtor" - это конструктор и деструктор.

Судя по соощениям у тебя не реализованы конструктр и деструктор класса CScaner. Кроме того, когда я писал свой пост, забыл сказать, что нужно подключить доп. библиотеку MSVCRT.LIB - поищи её в папке, куда ставил .NET, скопируй в папку проекта и добавь в проект. В частности, эта библиотека содержит реализацию метода new для unmanaged классов. Без неё точно работать не будет.

Чего не хватает ещё - не знаю.

Автор: Plamenk 24.10.2005, 11:36
2 Budda

Спасибо!

#pragma comment(lib, "MSVCRT") действительно решила проблему!

Но появляется следующий warning:

nochkclr.obj : warning LNK4099: PDB 'libc.pdb' was not found with 'C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib\nochkclr.obj' or at 'c:\Documents and Settings\alexy\Мои документы\Visual Studio Projects\SearchEngine\Debug\libc.pdb'; linking object as if no debug info

Может быть, у меня какие-то настройки проекта надо изменить? smile

Автор: Budda 24.10.2005, 14:56
Plamenk а у меня такое же ворнинг выскакивает. Я закрываю на него глаза, как я понимаю, он не критичен, хотя если кто-то подскажет, что такое libc.pdb и как его сделать , то скажу большое спасибо

Автор: Exception 24.10.2005, 16:10
ну..pdb - файл для дебаггинга. в нём имена переменных и т.п. просто откомпиль этот libc.dll в режиме debug. если он с сорсами, конечно

Автор: Budda 26.10.2005, 00:07
Run-time error, а где взять, этот libc.dll? Он что, в студии где-то лежит (я поискал - нигде нет)? И как его компилить?

Автор: stab 26.10.2005, 00:23
Цитата(Plamenk @ 24.10.2005, 15:36)
nochkclr.obj : warning LNK4099: PDB 'libc.pdb' was not found with 'C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib\nochkclr.obj' or at 'c:\Documents and Settings\alexy\Мои документы\Visual Studio Projects\SearchEngine\Debug\libc.pdb'; linking object as if no debug info


If you see this warning regarding nochkclr.obj, you can safely ignore it. (с) MSDN

Автор: Exception 26.10.2005, 07:04
а я о чём? он на самом деле нужен тока прогерам мелких - для отладки

Автор: Plamenk 26.10.2005, 08:23
Всем Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)