Поскольку 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();
}
}