C#如何調用C++(基礎篇)


閑暇之余,記一下筆記!記錄一下c#如何調用C++的動態庫(dll).

步驟:

一、創建一個C++類,例如:


AddOperate.h

extern _declspec(dllexport) int Sum(int a, int b);
class AddOperate
{
public :
};

AddOperate.cpp

#include "AddOperate.h"
#include "iostream"
using namespace std;

int Sum(int a, int b)
{
    if (a - (int)a != 0 || b - (int)b != 0) {
        cout << "請輸入整數" << endl;
        return -1;
    }
    return a + b;
}

 

2、將C++代碼編譯成動態庫dll

 

需要設置編譯配置:
A:項目--屬性---賠指數型--常規---配置類型---動態庫(.dll)

 

 B:項目--屬性--配置屬性--C/C++---高級---編譯為---便以為C++代碼(/TP)

 

 

 這個活動X64注意,調用放C#最好也用這個X64;

然后點擊項目--生成,就會看到dll了;

3、將dll拷貝到c#項目輸入目錄,一般在bin/debug下面;

4、編寫C#代碼調用dll

 [DllImport("Calculate.dll", CallingConvention = CallingConvention.Cdecl)]
        extern static int Sum(int a, int b);
        public static void Main(string[] args) {
            try {
                Console.WriteLine("請輸入NumberA:");
                int numberA = Convert.ToInt32(Console.ReadLine());

                Console.WriteLine("請輸入NumberB:");
                int numberB = Convert.ToInt32(Console.ReadLine());

                Console.WriteLine($"the numberA is:{numberA};numberB is:{numberB},The Sum is:{Sum(numberA, numberB)}");
               
            }
            catch(Exception ex) {
                Console.WriteLine($"ex:{ex}");
            }

            Console.ReadLine();
        }

主要是這兩行:

 

 

 

這個“Sum”方法必須跟dll方法名字相同,否則找不到;

接下來看看運行結果:

很尷尬,提示找不到“Sum”方法,難道我們的操作有問題。

排查了很久,發現C++方法編譯成dll時,方法名會改變,也是為了安全;

解決方案:

要把C++代碼轉化成C語言!

 

 就這樣,然后再編譯dll過來,再次執行:

結果:成功

 

五、其他可能遇到的問題

A:對PInvoke函數的調用導致堆棧不對稱問題

  方法定義加:CallingConvention = CallingConvention.Cdecl

B:未處理System.BadImageFormatException,試圖加載格式不正確的程序。 (異常來自 HRESULT:0x8007000B)

 

 就這樣OK了!。

六:思考:如果這個dll中有多個方法需要調用,

該怎么辦,是否是這樣,一個個聲明引用??

 

 預知結果,請看下一篇文章:《C#如何調用C++(進階篇)》,地址:https://www.cnblogs.com/skyfreedom/p/11783629.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM