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


Автор: Darked 21.5.2006, 19:40
       Всем доброго времени суток.

  Проясниет пожалуйста картину, кому не трудно. Как я понимаю, в CLR проектах уже не получится включить h-файлы nativ с++, которые содержат код на обычном С++? Типа такого:
Код

// The information written in a database 
class Object_Info {
public:
    Object_Info():
      numObject(NOT_DEFINED)
    , image(0)
    , templ(0)
    , skelet(0)
    , intT(0)
    , typeObject(emptyType)
    {
        fileName[0] = 0 ;
    }

[b]...[/b]

// Save obect to file
    int Save(DWORD cardID, string &objfile);
    // Load object from file
    int Load(LPCTSTR filename);

[b]...[/b]


   А как же тогда совмешать код? Все заголовки переписывать? 

Автор: Exception 21.5.2006, 20:07
В С# вообще такой код недопустим smile . А зачем тебе совмещать код? 

Автор: Darked 21.5.2006, 20:24
    Да вот, переписать одну dll нужно на CLR C++, ну, естественно, куча типов и данных за ней в h-файлах тянется. Пока не нашел как без h-ок переписать ; ) Пытался делать так:
Код

#pragma unmanaged
#include ".\..\..\Include\BaseTPData.h"
#pragma managed


  Так начинают такие ошибки валиться:

>...\Microsoft Visual Studio 8\VC\include\vadefs.h(89) : error C3862: '__va_start': cannot compile an unmanaged function with /clr:pure or /clr:safe
1>        #pragma unmanaged is in effect
1>...\Microsoft Visual Studio 8\VC\include\vadefs.h(90) : error C3862: '__va_arg': cannot compile an unmanaged function with /clr:pure or /clr:safe
1>        #pragma unmanaged is in effect
1>...\Microsoft Visual Studio 8\VC\include\vadefs.h(91) : error C3862: '__va_end': cannot compile an unmanaged function with /clr:pure or /clr:safe
1>        #pragma unmanaged is in effect


  Без pragma же придирается к native объявлениям:
Код

// Save obect to file
    int Save(DWORD cardID, string &objfile);
...\include\afisobj.h(113) : error C2061: syntax error : identifier 'string'

inline void* WINAPI InterlockedExchangePointer(void** pp, void* pNew) throw()

...\Microsoft Visual Studio 8\VC\atlmfc\include\atlconv.h(90) : error C3641: 'InterlockedExchangePointer' : invalid calling convention '__stdcall ' for function compiled with /clr:pure or /clr:safe
 

Автор: Exception 21.5.2006, 20:30
.NET не связан с С++. Поэтому я не вижу смысла переводить под него не-объектноориентированную библиотеку. А вообще, сделай сборку unsafe или пиши на С++/CLI. 

Автор: Darked 21.5.2006, 20:58
   В смысле unsafe сборку? Так же не понял насчет CLI/C++ ;( . Я токаначинаю с dot net разбираться.

    Библиотека, кстати, объектно-ориентированная должна получиться ;) . 

Автор: Exception 21.5.2006, 21:23
Ты можешь объяснить, зачем тебе дотнет? Он вот к такой бяке:

Цитата(Darked @  21.5.2006,  21:24 Найти цитируемый пост)
inline void* WINAPI InterlockedExchangePointer(void** pp, void* pNew) throw()


вообще винтиться не должен. Лучше уж пиши с нуля - WinAPI в дотнете - плохой тон.
Цитата(Darked @  21.5.2006,  21:58 Найти цитируемый пост)
В смысле unsafe сборку?


В свойствах проекта поищи.


Цитата(Darked @  21.5.2006,  21:58 Найти цитируемый пост)
Также не понял насчет CLI/C++


Это язык, более близкий к C++, чем C#. Точнее, это и есть C++. 

Автор: arilou 22.5.2006, 17:00
Darked, тебе надо переписать под дотнет с минимальными затратами, или есть вариант переосмыслить и переписать? 

Автор: Darked 22.5.2006, 21:05
arilou, мне нужно перенести смысл на dot net. Причем шеф сказал так, улыбаясь: "Заодно причеши код." Так что можно считать, что нужно осмыслить и написать тоже самое на dot net, но все равно некотоые старые наработки потянуться и туда, без этого никак. Пока по - другому не вижу. Тем более используются функции из нашего SDK, поэтому без h-ек никак.
[quote=Exception, 21.5.2006,  21:23, post738604]Ты можешь объяснить, зачем тебе дотнет? Он вот к такой бяке:

Цитата(Exception @  21.5.2006,  21:23 Найти цитируемый пост)
Ты можешь объяснить, зачем тебе дотнет? Он вот к такой бяке:

Цитата(Darked @  21.5.2006,  21:24 Найти цитируемый пост)
inline void* WINAPI InterlockedExchangePointer(void** pp, void* pNew) throw()


 До этого пока руки не дошли ; )

Цитата(Exception @  21.5.2006,  21:23 Найти цитируемый пост)
Это язык, более близкий к C++, чем C#. Точнее, это и есть C++.  

   Как я понимаю CLI никаког отношения к С++ не имеет, это просто инфраструктура. А если писать на .Net, то это и так получается CLR проект. 

Автор: arilou 23.5.2006, 10:20
Darked, ну тада в зависимости от объема работ. Переписывай на шарпе, а старые наработки можно вызывать из обычных DLL'ок через P/Invoke. 

Автор: Darked 23.5.2006, 17:19
Цитата(arilou @  23.5.2006,  10:20 Найти цитируемый пост)
Переписывай на шарпе, а старые наработки можно вызывать из обычных DLL'ок через P/Invoke.  

   Ну, шарп я не знаю, да и пожелания заказчика на С++. А объем работ не маленький... 

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