C# вызывает управляемые классы C++ для реализации смешанного программирования C# и C++.

искусственный интеллект

Поскольку C# пишет управляемый код, он компилируется для генерации Microsoft Intermediate Language, а код C++ компилируется для генерации собственного машинного кода (этот C++ также называется собственным C++ или неуправляемым C++, а VC6.0 — это платформа для разработки неуправляемого кода C++). , смешать два языка для программирования сложно. Чаще всего используется метод DllImport.Этот метод имеет много описаний в Интернете, поэтому здесь он подробно описываться не будет. Но любой, кто использовал этот метод, знает, что этот метод подходит для экспорта функций, но не может экспортировать неуправляемые классы C++! Очень фатально.

Однако, помимо C# и неуправляемого C++, в серии C есть также язык под названием управляемый C++, который почти такой же, как неуправляемый C++ по синтаксису, но скомпилирован в промежуточный язык Microsoft, такой как C#, так что управляемый C++ может хорошо взаимодействовать. с C#, т.е. вы можете использовать управляемые классы C++ в C#. Кроме того, управляемый C++ имеет две очень важные особенности: вы можете вызывать неуправляемые классы и функции C++! Управляемые сборки C++ могут вкладывать неуправляемый скомпилированный машинный код C++! Какая мощная смесь. Итак, наш технический путь ясен: C# использует управляемый C++ в качестве посредника для вызова неуправляемых классов и функций C++. Другими словами, это использование управляемого C++ для создания оболочки оболочки для неуправляемого кода C++ для вызова C#.

Окружение: VS2017, Win10;

Шаг 1. Создайте новую библиотеку классов CLR C++. Назовите его Test_DLL

 

Шаг 2. Создайте новый неуправляемый метод класса FunctionAdd.

ФункцияAdd.h:

//здесь определяем функцию C для экспорта

int Add(int a, int b);

ФункцияAdd.cpp:

#include "stdafx.h"

#include "FunctionAdd.h"

 

// реализуем здесь функцию C (арифметическое сложение)

int Add(int a, int b)

{

  return a + b;

}

Шаг 3. Создайте новый неуправляемый класс Native class

Родной.ч:

#pragma once

class Native

{

public:

    Native(void);

    ~Native(void);

 

int menber;//члены для экспорта

int menderFuncSub(int a, int b);//Функция-член, используемая для экспорта, реализации арифметического вычитания

};

 

Родной.cpp:

#include "stdafx.h"

#include "Native.h"

 

Native::Native(void)

{

//строительство

    menber = 1;

}

 

Native::~Native(void)

{

}

 

//Это арифметическое вычитание, реализованное неуправляемым классом C++

int Native::menderFuncSub(int a, int b)

{

    return a - b;

}

Третий шаг — создать новый управляемый класс clrClass.

clrClass.h:

 #pragma once

#include "Native.h"

//Это управляемый класс C++, используемый для инкапсуляции классов собственного кода C++, функций и т. д. для использования в C#

public ref class clrClass

//Должен быть объявлен как public, иначе класс не будет виден в сборке, ключевое слово ref указывает, что класс является управляемым классом и будет скомпилирован в промежуточный язык

{

public:

     clrClass(void);

 

int meber;//Этот член обращается к публичным членам неуправляемого класса CClassNative (на самом деле нужно обертывать только публичные члены и публичные функции-члены, приватная обертка бессмысленна и не может быть обернута)

int menderFuncSub(int a, int b);//Эта функция-член используется для переноса общедоступной функции-члена неуправляемого класса CClassNative

int menberFuncAdd(int a, int b);//Эта функция-член используется для переноса функции C int Add(int a, int b)

 

private:

Native * native;//Создаем экземпляр неуправляемого класса (созданного в конструкторе, что можно понимать как «наследование» открытых членов и методов CClassNative в clrClass)

};

clrClass.cpp:

#include "stdafx.h"

#include "clrClass.h"

#include "FunctionAdd.h"

 

using namespace System;

 

clrClass::clrClass(void)

{

native = new Native();//Будьте осторожны при создании здесь объектов! 

menber = native->menber;//Вот простой пример, лучше всего использовать метод атрибутов для чтения и записи членов класса CClassNative, аналогично C#, в управляемом C++ есть функции атрибутов, пожалуйста, проверьте использование себя

}

 

// Реализовать арифметическое вычитание, вызвав функцию вычитания неуправляемого класса CClassNative

int clrClass::menderFuncSub(int a, int b)

{

    return native->menderFuncSub(a, b);

}

 

// Реализовать арифметическое сложение, вызвав функцию C

int clrClass::menberFuncAdd(int a, int b)

{

    return Add(a, b);

}

Это реализует управляемую оболочку clrClass для класса Native и функцию C int Add(inta, int b). Сгенерированный Test_DLL.dll" можно использовать непосредственно в C#.

Шаг 4. Создайте новую программу WinForm и укажите ссылку на Test_DLL.dll.

 

Код:

    public partial class Form1 : Form

    {

        clrClass clr = null;

        public Form1()

        {

            InitializeComponent();

            clr = new clrClass();

        }

       

        private void button1_Click(object sender, EventArgs e)

        {

          

            int a = Convert.ToInt32(txtA.Text);

            int b = Convert.ToInt32(txtB.Text);

//Добавление реализовано вызовом функции C int Add(int a,int b) управляемым C++

            txtC.Text = clr.menderFuncSub(a, b).ToString();

        }

 

        private void btnAdd_Click(object sender, EventArgs e)

        {

            int a = Convert.ToInt32(txtA.Text);

            int b = Convert.ToInt32(txtB.Text);

//Добавление реализовано вызовом функции C int Add(int a,int b) управляемым C++

            txtC.Text = clr.menberFuncAdd(a, b).ToString();

        }

    }