2020年3月3日 星期二

C# 使用C++ DLL檔

最近因為工作需求,需要用C++寫OpenCV演算法,並從C#去使用其DLL檔,雖然我比較喜歡使用C++ OpenCV搭配Qt,但公司不允許只好照做摟~~~


Step1:加入一個c++的win 32Console App專案,名稱為SysAlgorithm,並記得選擇為DLL與空專案。



Step2:加入三個新項目,分別如下:(超偷懶只放add 和subtract)

SysAlgorithm.cpp:

#include "SysAlgorithm.h"

Calculator::Calculator()
{

}

Calculator::~Calculator()
{

}

int Calculator::add(int a, int b)
{
return(a + b);
}

int Calculator::subtract(int a, int b)
{
return(a - b);
}

SysAlgorithm.h:

#pragma once
#ifndef SYSALGORITHM_H
#define SYSALGORITHM_H

#include <fstream>
#include <string>

class Calculator
{
public:
Calculator();
~Calculator();

int add(int a, int b);
int subtract(int a, int b);
};

#endif // !SYSALGORITHM_H

Extern.cpp:

#ifdef SYSALGORITHM_EXPORTS
#define SYSALGORITHM_API __declspec(dllexport)
#include "SysAlgorithm.h"

extern "C" SYSALGORITHM_API int add(int a, int b)
{
Calculator Calculator;
return Calculator.add(a, b);
}

extern "C" SYSALGORITHM_API int subtract(int a, int b)
{
Calculator Calculator;
return Calculator.subtract(a, b);
}

#else
#define SYSALGORITHM_API __declspec(dllimport)
#endif

在Extern.cpp中,SYSALGORITHM_EXPORTS,綠色字要跟專案名稱一樣才行

Step3:修改專案屬性設定執行環境為x64與可以支援clr,如下圖



Step4:新增一個 c#的Console App專案,跟介面有關所以名稱設為SysUI,如下圖




Step5:修改Form1.cs內容

Form1.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace SysUI
{
    public partial class Form1 : Form
    {
        [DllImport("SysAlgorithm.dll", EntryPoint = "add", CallingConvention = CallingConvention.Cdecl)]
        private static extern int add(int a, int b);

        [DllImport("SysAlgorithm.dll", EntryPoint = "subtract", CallingConvention = CallingConvention.Cdecl)]
        private static extern int subtract(int a, int b);

        public Form1()
        {
            InitializeComponent();
            label1.Text = add(3, 5).ToString();
            label2.Text = subtract(3, 5).ToString();
        }

    }
}

-----------------------------------------
在Form1.cs中,要加入using System.Runtime.InteropServices,才能讀取外部dll檔案,並且加入參考,說明dll檔的位置,如下圖所示。



Step6:最後!!修改專案屬性設定執行環境為x64,並將C#專案設成初始啟動專案,不然會直接開成c++專案,而因為dll本身是無法被直接啟動,所以會跳錯喔!!




Step7:測試結果如下~

關於接DLL檔回傳值部分,可以參考C# 使用C++ DLL檔(回傳值)




沒有留言:

張貼留言