Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
 Аватар для Enflamed
3 / 3 / 1
Регистрация: 12.04.2015
Сообщений: 74

Библиотеки C++ : Как использовать в C# .Net?

22.08.2015, 15:13. Показов 4928. Ответов 19

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Я студент-вечерник, сейчас перехожу на 2-й курс (в среди .net вообще не шарю, умею только с виндоус формочками работать), учу C++ по программе универа на borland C++ и сам учу по книжке C# .Net 2010


сабж:


Реально ли включить библиотеки C++ вроде iostream, iomanip и подобные для использования в C# .Net при выводе, например, в окно консоли результата?

Предположим, я хочу вывести переменную типа double с определенным количеством знаков после запятой в окне консоли и хочу использовать cout << setprecision().

Я несу бред или это можно как-то простенько организовать в среде Visual Studio?

C# в VS вообще взаимодействует как-нибудь с библиотеками C или C++?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.08.2015, 15:13
Ответы с готовыми решениями:

Как использовать библиотеки WinAPI
Можно ли как-нибуть на C# использовать библиотеки WinAPI. Если да, то как? Если дадите пример на Media Foundation или DirectShow, то будет...

Как использовать функции System.Math без указания библиотеки
Необходимо писать большие формулы, включающие синусы и косинусы. Написал-забыл не прокатит, код выполняется динамически, так как нужен ввод...

Как использовать библиотеку JSON .NET
Помогите кто нибудь, караул кричать готов. Прилагающуюся документацию просмотрел, весь гугл облазил, как использовать эту библиотеку? (JSON...

19
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
22.08.2015, 15:33
У языков разный синтаксис. Поэтому это бред, я думаю.
Можно несколько изуверских способов придумать конечно.
С# использует .NET со своими функциями.

Зря ты так - C# в плане изучения язык очень простой,
синтаксис и структура проекта у него понятней.

Так вполне понятно.
C#
1
2
3
4
5
6
7
8
Console.WriteLine(SetPrecizion()); //что Console - класс отвечающий за консоль, а WriteLine - вывести строку
 
 
public int SetPrecizion(){
 
return 10;
 
}
А вот cout << setprecision() - по сути ничего не понятно абсолютно, если не знаешь точно и наверняка, что это.
C# интуитивен и прост. Советую, - лучше его изучить. Тебе понравится, я думаю.
0
 Аватар для Enflamed
3 / 3 / 1
Регистрация: 12.04.2015
Сообщений: 74
22.08.2015, 15:42  [ТС]
@Woldemar89

Да, язык действительно простой, но, похоже, что изучать одновременно C++ с ним не получится, поскольку
У языков разный синтаксис. С# использует .NET со своими функциями.


Хотел убить 2 зайца и изучать язык по учебной программе, и не относящийся к ней одновременно
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
22.08.2015, 15:54
Enflamed, смотрите в сторону P/Invoke. Я делал 2 программы в которой использовались библиотеки, хотя и Сишные для доступа к низкоуровневым операциям.
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
22.08.2015, 15:56
Цитата Сообщение от Enflamed Посмотреть сообщение
что изучать одновременно C++ с ним не получится
Я когда студентом был, писал на C++, как требовала программа обучения.
Но это не мешало мне изучать С# параллельно и далее на нем диплом написать.


Цитата Сообщение от Enflamed Посмотреть сообщение
Я студент-вечерник
Подумай, всерьез ли все с программированием, понадобится ли оно в будущем.
Обычно на вечерку идут, чтобы корочку-диплом получить, не более.
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
22.08.2015, 16:04
Сишные для доступа к низкоуровневым операциям.
Если для изучения, и хочется поизвращаться то все можно делать на С#
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
22.08.2015, 16:05
Цитата Сообщение от pro_100_gram Посмотреть сообщение
смотрите в сторону P/Invoke
Ответ логичен, но ТС только изучает язык\и, как я понял, и просил

Цитата Сообщение от Enflamed Посмотреть сообщение
как-то простенько организовать
А PInvoke, - не так уж "простенько", по-моему ТСу знаний явно недостаточно, чтобы это реализовать.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
22.08.2015, 16:08
Konctantin, Нельзя на шарпе вызывать низкоуровневые ф-ции без P/Invoke

Добавлено через 2 минуты
Woldemar89, P/Invoke не сложен сам по себе, если есть знания языка, ф-ции которого таким способом необходимо вызвать из кода C#.
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
22.08.2015, 16:24
Konctantin, Нельзя на шарпе вызывать низкоуровневые ф-ции без P/Invoke
но их самому можно написать, вплоть до asm вставок
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
22.08.2015, 16:48
Konctantin, И как это сделать без P/Invoke?
0
 Аватар для Enflamed
3 / 3 / 1
Регистрация: 12.04.2015
Сообщений: 74
22.08.2015, 17:21  [ТС]
смотрите в сторону P/Invoke.
@Konctantin
Спасибо, думаю, это то, что мне надо


Подумай ... с программированием, понадобится ли оно ...
@Woldemar89
Ну, вообще-то, я планирую писать приложения ...
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18288 / 14211 / 5368
Регистрация: 17.03.2014
Сообщений: 28,889
Записей в блоге: 1
22.08.2015, 17:59
Цитата Сообщение от Enflamed Посмотреть сообщение
Реально ли включить библиотеки C++ вроде iostream, iomanip и подобные для использования в C# .Net при выводе, например, в окно консоли результата?
Это классы, а не библиотеки. Использовать их в C# не получится.

Цитата Сообщение от Enflamed Посмотреть сообщение
Предположим, я хочу вывести переменную типа double с определенным количеством знаков после запятой в окне консоли и хочу использовать cout << setprecision().
В .NET есть свои средства форматирования вывода.
C#
1
2
// Выводим константу Пи округленную до 4 знаков после запятой
Console.WriteLine("Пи = {0:F4}", Math.PI);
Цитата Сообщение от Enflamed Посмотреть сообщение
Я несу бред или это можно как-то простенько организовать в среде Visual Studio?
Это бессмысленный вопрос. Visual Studio это среда разработки поддерживающая множество языков программрования со своими средствами управления выводом. Следует интересоваться возможностями C#/.NET.

Цитата Сообщение от Enflamed Посмотреть сообщение
C# в VS вообще взаимодействует как-нибудь с библиотеками C или C++?
С библиотеками (*.lib файлы) нет. C# умеет вызывать экспортируемые методы из динамических библиотек (*.dll) с помощью p/invoke.
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
22.08.2015, 20:15
вот образный пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
delegate int func();
 
var asm = new byte[] {
    // int func() { return 1; }
    // mov eax, 1
    // retn
    0xB8, 0x01, 0x00, 0x00, 0x00,
    0xC3
};
 
// предварительно разрешить выполнение участка кода
 
fixed (byte* pointer = asm)
{
    var val = (Marshal.GetDelegateForFunctionPointer((IntPtr)pointer, typeof(func)) as func)();
    Console.WriteLine(val);
}
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
22.08.2015, 21:02
Konctantin, не очень вкусно смотрится такой код. Это в разы тяжелее чем выполнить тоже самое через P/Invoke.

Таким способом вы не сможете написать такое например:

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
    //структура (номер кластера на диске, число звнятых кластеров)
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct NtfsFileData
    {
        public long LCN;
        public long VCN;
    };
    //структура (секторов на кластер, байт в секторе)
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct HddInfo
    {
        public int lpSectorsPerCluster;
        public int lpBytesPerSector;
    };
    //класс предоставляет информацию файловой системы NTFS в windows
    public class NtfsFileInfo
    {
        public NtfsFileData NtfsFileData { get; set; }
        public HddInfo HddInfo { get; set; }
        //подключение внешних функций на языке СИ через p/invoke
        [DllImport("Fragmentation.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        extern static void GetMftFileInfo(string file_name, out NtfsFileData buffer);      
        [DllImport("Fragmentation.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        extern static void GetHddInfo(string bufDisk, out HddInfo buffer);
        //получение информации о файле из таблицы MFT
        public void GetMftFileInfo(string file_name)
        {
            NtfsFileData buffer;
            GetMftFileInfo(file_name, out buffer);
            NtfsFileData = buffer;
        }
        //получение информации о кластерах и секторах на текущем томе
        public static HddInfo GetHddInfo(string diskName)
        {
            HddInfo buffer;
            GetHddInfo(diskName, out buffer);
            return buffer;
        }
    }
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#pragma comment(linker, "/def:Source.def") // Указание линкеру добавить список экспорта
typedef struct _PHYS_LOC
{
    // starting LCN
    LARGE_INTEGER  uStartingLcn;
 
    // length in clusters
    UINT  uClustLen;
}PHYS_LOC;
typedef struct NtfsFileData
{
    LARGE_INTEGER VCN;
    LARGE_INTEGER LCN;
};
typedef  struct HddInfo
{
    int lpSectorsPerCluster;
    int lpBytesPerSector;
};
extern "C" __declspec(dllexport) void __stdcall GetHddInfo(LPTSTR bufDisk, HddInfo& buffer)
{
    DWORD lpSectorsPerCluster,lpBytesPerSector;
 
   BOOL GTDFS= GetDiskFreeSpace(
     bufDisk, //Строка определяющая корневой каталог устройства
    &lpSectorsPerCluster, // Число секторов на кластер.
    &lpBytesPerSector, //  Число байт на сектор.
     NULL, // Число свободных кластеров на диске.
     NULL // Число кластеров на диске
);
   buffer.lpSectorsPerCluster = lpSectorsPerCluster;
   buffer.lpBytesPerSector = lpBytesPerSector;
}
extern "C" __declspec(dllexport) void __stdcall GetMftFileInfo(LPTSTR file_name, NtfsFileData& buffer)
{
HANDLE fhwnd     = INVALID_HANDLE_VALUE;
BYTE * OutBuffer = 0;//буффер для данных DeviceIOControl(FSCTL_GET_RETRIEVAL_POINTER)
DWORD  OutBufferSize = 0;
 
__try
{
     // open the file we are interested in
     fhwnd = CreateFile(file_name, FILE_READ_ATTRIBUTES, 0,
                      NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     if( fhwnd == INVALID_HANDLE_VALUE )
    {
       __leave;
    }
 
    // check file is not empty
    if( GetFileSize( fhwnd, NULL ) < 4096 )
    {
        __leave;
    }
 
    // Попытка получение из MFT информации о фрагментации файла
    STARTING_VCN_INPUT_BUFFER StVCN;
    StVCN.StartingVcn.QuadPart=0;
    DWORD BytesReturned = 0;
    OutBufferSize = sizeof(RETRIEVAL_POINTERS_BUFFER)+128*16;
    for(;;)
    {
    OutBuffer = new BYTE[OutBufferSize];
    if( !DeviceIoControl( fhwnd, FSCTL_GET_RETRIEVAL_POINTERS, &StVCN,sizeof(StVCN), OutBuffer,
              OutBufferSize, &BytesReturned, NULL ))
    {
         //если буфер мал увеличить
             DWORD er = GetLastError();
         if(er != ERROR_MORE_DATA )
             {
                __leave;
             }
        
             OutBufferSize *= 2;
             delete [] OutBuffer;
    }
    else  break; //все данные были прочитаны
    }
 
     // чтение информации полученной с помощью FSCTL_GET_RETRIEVAL_POINTERS
     RETRIEVAL_POINTERS_BUFFER* Fc = (RETRIEVAL_POINTERS_BUFFER*) OutBuffer;
     if( Fc->ExtentCount ) //not empty, fill in ContigLens
     {  
         PHYS_LOC * aRes = new PHYS_LOC[ Fc->ExtentCount ]; // !!!! HERE RESULT    
    
         // manually fill in the first cell
         aRes[0].uClustLen    = Fc->Extents[0].NextVcn.QuadPart - Fc->StartingVcn.QuadPart;
         aRes[0].uStartingLcn = Fc->Extents[0].Lcn;
         for( int i = 1; i < Fc->ExtentCount; i++ )
         {
             aRes[i].uClustLen = Fc->Extents[i].NextVcn.QuadPart - Fc->Extents[i-1].NextVcn.QuadPart;
                 aRes[i].uStartingLcn = Fc->Extents[i].Lcn;          
         }
     }
     buffer.LCN = Fc->Extents->Lcn;
     buffer.VCN = Fc->Extents->NextVcn;
}
__finally
{
 
     // free resources
     if( OutBuffer )    
        delete [] OutBuffer;
    if( fhwnd != INVALID_HANDLE_VALUE )
        CloseHandle( fhwnd );
};
}
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
22.08.2015, 22:01
Я написал, что в целях обучения можно написать что угодно.
В вашем случае не вижу необходимости писать "прослойку", для вытаскивания подобной информации, через тот же PInvoke можно написать все то же без библиотеки на С++.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
22.08.2015, 22:06
Konctantin, Нельзя с помощью C# получить информацию из таблицы MFT иначе бы я именно так и сделал.
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
23.08.2015, 14:01
Цитата Сообщение от Konctantin Посмотреть сообщение
но их самому можно написать, вплоть до asm вставок
Цитата Сообщение от Konctantin Посмотреть сообщение
вот образный пример:
И смысл в этих функциях, и этом примере если без p/invoke все равно это работать не будет ?
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
23.08.2015, 20:40
И смысл в этих функциях, и этом примере если без p/invoke все равно это работать не будет ?
Смысл в том, чтобы знать возможности языка.

ах да,
Konctantin, Нельзя с помощью C# получить информацию из таблицы MFT иначе бы я именно так и сделал.
А в чем проблема реализовать тот же функционал, используя импортную функцию DeviceIoControl, без лишней дополнительной ДЛЛки.
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
23.08.2015, 20:46
Цитата Сообщение от Konctantin Посмотреть сообщение
Смысл в том, чтобы знать возможности языка.
И что там знать то ? Одна функция которая делает из поинтера делегат
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
23.08.2015, 21:37
Цитата Сообщение от Konctantin Посмотреть сообщение
А в чем проблема реализовать тот же функционал, используя импортную функцию DeviceIoControl, без лишней дополнительной ДЛЛки.
Смысл в том, что придется кроме одной ф-ции (DeviceIoControl) тянуть другие ф-ции и структуры. => это более друдоемко и увеличит объем кода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.08.2015, 21:37
Помогаю со студенческими работами здесь

Puma.Net, как использовать (распознать текст с картинки)
Нужно распознать текст с картинки. Нашел такую штуку, как Puma.Net, но не пойме как ей пользоваться. Дайте хотя бы пример. Заранее...

Как использовать методы библиотеки DLL, и игнорировать их, когда DLL нету?
Как использовать методы библиотеки DLL , и игнорировать их когда DLL нету Что нужно , мне нужно так чтоб проверялось наличие библиотеки ...

Можно ли использовать библиотеки написанные на .net Core для .net FW
Можно ли подключить библиотеку написанную на .net Core к WinForm приложению написанному на .net FW? Почитал описание .net Core 3....

Возможно ли использовать библиотеки .NET в макросах для Word на VB?
Нужно написать костыль на пару десятков строк, сижу и понимаю что с .NET я это сделаю за 20 минут, а пока изучу этот VB пол дня пройдет....

Какие библиотеки OpenGL лучше использовать с VB.NET и в чем разница?
В данном деле я новичок. Программирую на Visual Basic NET. Пытаюсь создать графический фрагмент. Есть три dll: 1....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru