精品国产一区在线_av无码中文字幕无码王_天海翼三点刺激高潮不停_好硬好大好爽视频_欧美高清一区三区在线专区_香蕉黄色片

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖

C#和C++混合編程開發示例(VS2022上調試通過)

C#使用過程中經常會遇到和C++聯合開發的過程,通過C++編寫動態庫,封裝成dll后再C#中調用,在此做個記錄,并供后期查看

一、新建C#控制臺項目

打開VisualStudio,新建一個C#控制臺項目,項目名稱HelloWorldTest

點擊下一步,一個空的默認c#項目創建完成

二、創建C++庫

在解決方案上右鍵--添加--新建項目,建一個C++動態鏈接庫工程,輸入項目名稱TestDll

創建完成后如下,在源文件--右鍵--新建項--添加C++(.CPP文件),文件內容如下:

#include "pch.h"
#include "HelloDll.h"
#include<iostream>

void HelloWorld(char* name)
{
	std::cout << "Hello World " << name << std::endl;
}

int Test()
{
	return 123456;
}

int Add(int a, int b)
{
	return a + b;
}

C++庫導出有兩種方式,但是最好兩種方式同時使用,據說第二種是為了防止名字錯亂,

   1、以C語言接口的方式導出

在頭文件--右鍵--新建項,然后新建HelloDll.h頭文件,如下圖

這種方法就是在函數前面加上 extern "C" __declspec(dllexport)

加上extern "C"后,會指示編譯器這部分代碼按C語言的進行編譯,而不是C++的。

extern "C" __declspec(dllexport) void HelloWorld(char* name);
extern "C" __declspec(dllexport) int Test();
extern "C" __declspec(dllexport) int Add(int a,int b);

2、以模塊定義文件的方式導出

在源文件上點擊右鍵,選擇添加-》新建項

然后選擇代碼-》模塊定義文件

在HelloDll.def中輸入

LIBRARY "HelloDll"

EXPORTS

HelloWorld @ 1 
Test @ 2
Add @ 3

EXPORTS下面就是要導出的函數,這里不需要添加分號隔開,直接換行就行。

編譯,生成dll。這里需要注意的是,如果生成是64位的庫,C#程序也要是64位的,否則會報錯,下圖中默認是首選32位,所以需要把首選32位前的√去掉

在C#項目中添加引用:同時把C#代碼修改為:

因為要用到DllImport,所以先導入命名空間using System.Runtime.InteropServices;

注意:在DllImport導入C/C++編寫的動態庫時函數,可以加上一些約定參數,例如:

[DllImport(@"HelloDll.dll", EntryPoint = "Test", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]

CallingConvention = CallingConvention.Cdecl,來指定入口點的調用約定,否則有可能會 報錯

因為C/C++編寫的動態庫默認的入口點約定為_cdecl,而VS默認調用動態庫時的約定為_winapi

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace DllTest
{
    internal class Program
    {
        [DllImport("HelloDll.dll")]
        public static extern void HelloWorld(string name);
        [DllImport("HelloDll.dll")]
        public static extern int Test();
        [DllImport("HelloDll.dll")]
        public static extern int Add(int a, int b);

        static void Main(string[] args)
        {
            Console.WriteLine(Test().ToString());
            Console.WriteLine(Add(2, 5));
            HelloWorld("LiLi");
            Console.ReadKey();
        }
    }
}

運行程序,結果如下:

這樣就成功實現了C#調用的C++庫


全部回復(41)
正序查看
倒序查看
米修兒
LV.4
2
2021-12-15 14:49

兩種導出方式都可以正常運行,但是同事說最好兩種導出方式同時都有,否則可能會出現名字混亂等未知情況,也歡迎大家一起討論

0
回復
晨風
LV.1
3
2021-12-18 09:35

不錯,受益匪淺

0
回復
2021-12-18 09:40

C#和C++還可以混合編程開發,長見識了

0
回復
十三貓
LV.1
5
2021-12-20 08:48

新視角,新的切入點,不錯不錯,跟著大神學習

0
回復
2021-12-20 12:27

有空也學習一下,要學的東西很多啊

0
回復
米修兒
LV.4
7
2021-12-20 16:45
@lihui710884923
C#和C++還可以混合編程開發,長見識了

最近也是有空,準備補習下C++,一起學習交流吧

0
回復
十三貓
LV.1
8
2021-12-20 20:24

C++庫兩種方式導出方式,平時也是習慣兩種都寫上

0
回復
2021-12-22 14:58

vs確實是宇宙最強大編輯器,沒有之一,C++,python都能勝任

0
回復
dy-q1PtffAR
LV.1
10
2021-12-22 14:59

根據示例調試了一遍,順利調試通過,學習了

0
回復
米修兒
LV.4
11
2021-12-22 15:01
@dy-q1PtffAR
vs確實是宇宙最強大編輯器,沒有之一,C++,python都能勝任

是的,是的,沒有VS干不了的事,現在新版本也是越來越強大了,但是占用資源也越來越大

0
回復
米修兒
LV.4
12
2021-12-22 15:02
@lihui710884923
有空也學習一下,要學的東西很多啊

有C基礎,轉入C++基本可以無縫對接

0
回復
米修兒
LV.4
13
2021-12-22 15:05
@lihui710884923
有空也學習一下,要學的東西很多啊

你是用C高手,轉投C++so easy

0
回復
晨風
LV.1
14
2021-12-22 15:09

HelloWorld @ 1 

Test @ 2

Add @ 3   這個里面的標號是不是必須的,看有的程序里面沒有標號

0
回復
米修兒
LV.4
15
2021-12-23 09:02
@晨風
HelloWorld@1 Test@2Add@3  這個里面的標號是不是必須的,看有的程序里面沒有標號

我看很多教程上確實沒有標號,但是看很多前輩的程序里面都有標號,不知道是因為這樣更清晰還是因為需要

0
回復
2021-12-23 14:06

生成dll的時候,一定要記得跟C#選一樣的X64為平臺,或者去掉首選32位,要不調試報錯

1
回復
dy-SLPHrVRz
LV.1
17
2021-12-23 15:30

看過C++一直沒學好指針,文章寫的通俗易懂,收藏了

0
回復
dy-SLPHrVRz
LV.1
18
2021-12-23 15:30

寫的很詳盡,遇到問題了過來一起討論

0
回復
dy-SLPHrVRz
LV.1
19
2021-12-23 15:31

很不錯的教程,正好需要,先馬后看

0
回復
dy-SLPHrVRz
LV.1
20
2021-12-23 15:39

C#確實強大,開發Unity3D,開發C++真的是無所不能

0
回復
2021-12-23 15:45

先順手收藏起來,等有問題方便過來查找討論

0
回復
米修兒
LV.4
22
2021-12-23 16:04
@dy-SLPHrVRz
C#確實強大,開發Unity3D,開發C++真的是無所不能

是的,Vs是真的強大,宇宙最強編輯器

0
回復
米修兒
LV.4
23
2021-12-23 16:08
@星球居民-6wBTmHfM
生成dll的時候,一定要記得跟C#選一樣的X64為平臺,或者去掉首選32位,要不調試報錯

我第一次調試的時候,雖然選了64位,但是忘了把首選32位去掉,結果編譯錯誤

0
回復
米修兒
LV.4
24
2021-12-23 16:10
@dy-SLPHrVRz
看過C++一直沒學好指針,文章寫的通俗易懂,收藏了

不好學,但是很多人用的東西,一定有很多的過人之處,努力學習中

0
回復
米修兒
LV.4
25
2021-12-23 16:13
@dy-SLPHrVRz
很不錯的教程,正好需要,先馬后看

我也是邊學習邊記錄,下次需要就好找了

0
回復
米修兒
LV.4
26
2021-12-23 16:22
@星球居民-6wBTmHfM
先順手收藏起來,等有問題方便過來查找討論

我也是邊學習,邊記錄,也方便自己查看,順便記錄也是學習的過程

0
回復
米修兒
LV.4
27
2021-12-23 16:29
@星球居民-6wBTmHfM
先順手收藏起來,等有問題方便過來查找討論

對,先收藏,需要的時候好找,要不需要的時候找不到了

0
回復
#回復內容已被刪除#
28
#回復內容已被刪除#
29
dy-NCJU4yct
LV.1
30
2021-12-27 09:17

VS確實強大,竟然可以開發python,有空摸索一下

0
回復
dy-NCJU4yct
LV.1
31
2021-12-27 09:27

重新開始學習,把大學拉掉的再學會來

0
回復
主站蜘蛛池模板: 精品蜜臀久久久久99网站 | 色偷偷噜噜噜亚洲男人的天堂 | 中国china露脸自拍性hd | 亚洲综合图片区色 | 99在线精品免费视频 | 久久亚洲综合色 | 中文字幕av在线 | 日韩在线aⅴ免费视频 | 亚洲视频一二三 | 岛国片在线看 | 鲁大师在线视频播放免费观看 | 亚洲第二色| 激情国产视频 | 一区二区三区国 | 国产av一区二区三区无码野战 | 精品久久久久久久久中文字幕 | 在线亚洲一区观看 | 久久综合狠狠综合久久综青草 | 中文字幕免费在线观看视频 | 国产成人在线高清 | 亚洲成年人网站在线观看 | www.com豆花视频 | 亚洲AV最新在线观看网址 | 国产免费一区二区三区在线观看 | 新99热| 国产成人精品一区二三区四区五区 | 日韩一本| 性欧美粗暴HD | WWW国产精品内射老师 | 色播五月激情五月 | 国产真实伦实例对白 | 欧美一区二区三区精品 | 少妇把腿扒开让我舔18 | 国产精品高潮呻吟 | 九九热在线免费视频 | 午夜免费看毛片 | 成人免费片库 | 直接看91| JAPANESEHD无码专区 | 99免费视频 | 亚洲国产成人片在线观看 |