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 "ФункцияAdd.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 "Родной.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 "Родной.h"
//Это управляемый класс C++, используемый для инкапсуляции классов собственного кода C++, функций и т. д. для использования в C#
public ref class clrClass
//Должен быть объявлен как public, иначе класс не будет виден в сборке, ключевое слово ref указывает, что класс является управляемым классом и будет скомпилирован в промежуточный язык
{
public:
clrClass(void);

int menber;//这个成员访问非托管类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 "ФункцияAdd.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++调用C函数int Add(int a,int b)实现的加法
        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++调用C函数int Add(int a,int b)实现的加法
        txtC.Text = clr.menberFuncAdd(a, b).ToString();
    }
}