延續 DLL 4 在DLL中加入 Class範例 : https://dotblogs.com.tw/April_Notes/2025/01/07/095021
之前寫的 如何創建 C# 可以使用的 C++ DLL檔案 有新的方法
1. 先修改一段 DLL 加入extern "C" MYDLL_API
MyDLL.cpp
#include "pch.h"
#include <cmath>
#include <iostream>
#include "MyDLL.h"
ADD_Control::ADD_Control()
{
std::cout << "Hello ADD";
}
int ADD_Control::Add_test(int i, int j)
{
return i + j;
}
extern "C" MYDLL_API int Add(int a, int b);
extern int Add(int a, int b)
{
ADD_Control ADD_Csharp;
return ADD_Csharp.Add_test(a, b);
}
MyDLL.h
#pragma once
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
using namespace std;
class MYDLL_API ADD_Control {
public:
ADD_Control();
int Add_test(int i,int j);
private:
int ADD_ID = 0;
};
2. C# 使用 PInvoke
使用Framework 來測試 C# 測試 :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
[DllImport("MyDLL.dll", EntryPoint = "Add", CallingConvention = CallingConvention.Cdecl)]
private static extern int add(int a, int b);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
button1.Text = add(1,2).ToString();
}
}
}
為了方便 可以將EXE複製到DLL那邊
在建置事件後 加入
xcopy /y /d $(TargetDir)$(TargetFileName) $(SolutionDir)$(PlatformName)\$(ConfigurationName)
選擇 Framework 來測試 C#
大致上我簡單畫一下