Форум программистов, компьютерный форум CyberForum.ru

Тело на с++, интерфейс на с#. Как сляпать это добро? - C++

Восстановить пароль Регистрация
 
Suslo
2 / 2 / 0
Регистрация: 30.11.2013
Сообщений: 80
Завершенные тесты: 1
23.01.2014, 17:24     Тело на с++, интерфейс на с#. Как сляпать это добро? #1
Ну, собственно, хочу сделать программу на с++, привязав к ней интерфейс из с#. Как осуществить привязку? Поподробнее, плиз. На спасибо не скуплюсь
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TeachMeC
18 / 18 / 4
Регистрация: 10.01.2014
Сообщений: 45
23.01.2014, 18:48     Тело на с++, интерфейс на с#. Как сляпать это добро? #2
1) COM (лично дела не имел )
2) C++/CLI
3) технология Pinvoke
Выбирайте

Не по теме:

Цитата Сообщение от Suslo Посмотреть сообщение
На спасибо не скуплюсь
ради бога , не надо мне спасибок

MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
23.01.2014, 19:01     Тело на с++, интерфейс на с#. Как сляпать это добро? #3
Интерфейс на C#, код на С++: возможно ли?
t1m0n
 Аватар для t1m0n
595 / 382 / 18
Регистрация: 03.11.2009
Сообщений: 1,788
23.01.2014, 22:11     Тело на с++, интерфейс на с#. Как сляпать это добро? #4
может лучше сделать на Qt
TeachMeC
18 / 18 / 4
Регистрация: 10.01.2014
Сообщений: 45
24.01.2014, 13:39     Тело на с++, интерфейс на с#. Как сляпать это добро? #5
Suslo, портировал 3 функции (всего)
из msvcrt.dll : fopen, fgets, fclose
У вас будут свои функции или своя .dll.
Цитата Сообщение от TeachMeC Посмотреть сообщение
2) C++/CLI
В случае с C++/CLI функции помещаются в управляемую сборку.
Сборка потом добавляется к проекту на C#
Кликните здесь для просмотра всего текста
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
// CPPCliClassLibrary1.h
 
#pragma once
 
#include <cstdio>
#include <cstring>
#include <vcclr.h>
using namespace System;
using namespace System::Runtime::InteropServices;
 
namespace CPPCliClassLibrary1 {
 
 
    public ref class FileReader 
    {
    public:
        FileReader(String^ fileName);
        ~FileReader();
        !FileReader();
        void FileClose();
        String^  ReadString();
        static FILE * FileReader::OpenFile(String^ fileName);
    private:
        FILE * pFile;
        bool disposed;
 
    };
 
    FileReader::FileReader(String^ fileName) 
        : disposed ( false), pFile(OpenFile(fileName))
    {
    }
 
    FILE * FileReader::OpenFile(String^ fileName)
    {
      
        const char* chFileName = (const char*)(Marshal::StringToHGlobalAnsi(fileName)).ToPointer();    
        FILE * mFile = fopen (chFileName, "r");
        Marshal::FreeHGlobal(IntPtr((void*)chFileName ));
        return mFile;
    }
 
    FileReader::~FileReader()
    {
        if( !  disposed)
            this->!FileReader();
    }
 
    FileReader::!FileReader()
    {
        fclose(pFile);
    }
 
    void FileReader::FileClose()
    {
        fclose(pFile);
        disposed = true;
    }
 
    String^  FileReader::ReadString()
    {    
        char buffer[100]= {{'\0'}}; 
        fgets (buffer , 100 , pFile);
        return gcnew String(buffer);    
    }
}

Цитата Сообщение от TeachMeC Посмотреть сообщение
3) технология Pinvoke
Пишем класс на C#, в нем используем функции из msvcrt.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
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
 public class FileReader : IDisposable
    {
        #region Native Methods
        [DllImport("msvcrt.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
        static extern IntPtr fopen(String filename, String mode);
        [DllImport("msvcrt.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
        static extern Int32 fclose(IntPtr file);
        [DllImport("msvcrt.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
        static extern IntPtr fgets(StringBuilder str, int num, IntPtr stream);
        #endregion
 
      
        public FileReader(String fileName)
        {
            pFile = fopen(fileName, "r");
        }
        ~FileReader()
        {
            if (!disposed)
            {
                disposed = true;
                Dispose(false);
            }
        }
 
        public String ReadString()
        {
            StringBuilder stringBuilder = new StringBuilder(100);
            fgets(stringBuilder, 100, pFile);
            return stringBuilder.ToString();
        }
        private readonly IntPtr pFile;
        public bool disposed = false;
 
 
 
 
        public void Dispose()
        {
            if (!disposed)
            {
                disposed = true;
                Dispose(true);
                GC.SuppressFinalize(this);
            }
        }
 
        public void Close()
        {
            Dispose();
        }
 
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                // managed objects
            }
            // unmanaged objects and resources
            fclose(pFile);
        }
 
 
    }

Вызов будет одинаковый в обоих случаях. Например в C#WindowsForms.
При нажатии кнопки RichTextBox заполнится содержимым файла
Кликните здесь для просмотра всего текста
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
  const string filepath = @"Documents\myTextFile.txt";
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            if (! System.IO.File.Exists(filepath))
            {
                 
                MessageBox.Show("File not found");
                return;
            }
           
                using (FileReader fileReader = new FileReader(filepath))
                {
                    while (true)
                    {
                        String line = fileReader.ReadString();
                        if (String.IsNullOrEmpty(line))
                        {
                            break;
                        }
                        richTextBox1.AppendText(line);
                    }
                }
           
        }
Yandex
Объявления
24.01.2014, 13:39     Тело на с++, интерфейс на с#. Как сляпать это добро?
Ответ Создать тему
Опции темы

Текущее время: 21:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru