91视频免费?看_蜜芽MY188精品TV在线观看_国产免费无遮挡在线观看视频_深夜国产_亚洲精品欧洲精品_欧美黑人粗暴多交

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

C#和C++混合編程開(kāi)發(fā)示例(VS2022上調(diào)試通過(guò))

C#使用過(guò)程中經(jīng)常會(huì)遇到和C++聯(lián)合開(kāi)發(fā)的過(guò)程,通過(guò)C++編寫(xiě)動(dòng)態(tài)庫(kù),封裝成dll后再C#中調(diào)用,在此做個(gè)記錄,并供后期查看

一、新建C#控制臺(tái)項(xiàng)目

打開(kāi)VisualStudio,新建一個(gè)C#控制臺(tái)項(xiàng)目,項(xiàng)目名稱(chēng)HelloWorldTest

點(diǎn)擊下一步,一個(gè)空的默認(rèn)c#項(xiàng)目創(chuàng)建完成

二、創(chuàng)建C++庫(kù)

在解決方案上右鍵--添加--新建項(xiàng)目,建一個(gè)C++動(dòng)態(tài)鏈接庫(kù)工程,輸入項(xiàng)目名稱(chēng)TestDll

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

#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++庫(kù)導(dǎo)出有兩種方式,但是最好兩種方式同時(shí)使用,據(jù)說(shuō)第二種是為了防止名字錯(cuò)亂,

   1、以C語(yǔ)言接口的方式導(dǎo)出

在頭文件--右鍵--新建項(xiàng),然后新建HelloDll.h頭文件,如下圖

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

加上extern "C"后,會(huì)指示編譯器這部分代碼按C語(yǔ)言的進(jìn)行編譯,而不是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、以模塊定義文件的方式導(dǎo)出

在源文件上點(diǎn)擊右鍵,選擇添加-》新建項(xiàng)

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

在HelloDll.def中輸入

LIBRARY "HelloDll"

EXPORTS

HelloWorld @ 1 
Test @ 2
Add @ 3

EXPORTS下面就是要導(dǎo)出的函數(shù),這里不需要添加分號(hào)隔開(kāi),直接換行就行。

編譯,生成dll。這里需要注意的是,如果生成是64位的庫(kù),C#程序也要是64位的,否則會(huì)報(bào)錯(cuò),下圖中默認(rèn)是首選32位,所以需要把首選32位前的√去掉

在C#項(xiàng)目中添加引用:同時(shí)把C#代碼修改為:

因?yàn)橐玫紻llImport,所以先導(dǎo)入命名空間using System.Runtime.InteropServices;

注意:在DllImport導(dǎo)入C/C++編寫(xiě)的動(dòng)態(tài)庫(kù)時(shí)函數(shù),可以加上一些約定參數(shù),例如:

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

CallingConvention = CallingConvention.Cdecl,來(lái)指定入口點(diǎn)的調(diào)用約定,否則有可能會(huì) 報(bào)錯(cuò)

因?yàn)镃/C++編寫(xiě)的動(dòng)態(tài)庫(kù)默認(rèn)的入口點(diǎn)約定為_(kāi)cdecl,而VS默認(rèn)調(diào)用動(dòng)態(tài)庫(kù)時(shí)的約定為_(kāi)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();
        }
    }
}

運(yùn)行程序,結(jié)果如下:

這樣就成功實(shí)現(xiàn)了C#調(diào)用的C++庫(kù)


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

兩種導(dǎo)出方式都可以正常運(yùn)行,但是同事說(shuō)最好兩種導(dǎo)出方式同時(shí)都有,否則可能會(huì)出現(xiàn)名字混亂等未知情況,也歡迎大家一起討論

0
回復(fù)
2021-12-18 09:35

不錯(cuò),受益匪淺

0
回復(fù)
2021-12-18 09:40

C#和C++還可以混合編程開(kāi)發(fā),長(zhǎng)見(jiàn)識(shí)了

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

新視角,新的切入點(diǎn),不錯(cuò)不錯(cuò),跟著大神學(xué)習(xí)

0
回復(fù)
2021-12-20 12:27

有空也學(xué)習(xí)一下,要學(xué)的東西很多啊

0
回復(fù)
米修兒
LV.4
7
2021-12-20 16:45
@lihui710884923
C#和C++還可以混合編程開(kāi)發(fā),長(zhǎng)見(jiàn)識(shí)了

最近也是有空,準(zhǔn)備補(bǔ)習(xí)下C++,一起學(xué)習(xí)交流吧

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

C++庫(kù)兩種方式導(dǎo)出方式,平時(shí)也是習(xí)慣兩種都寫(xiě)上

0
回復(fù)
2021-12-22 14:58

vs確實(shí)是宇宙最強(qiáng)大編輯器,沒(méi)有之一,C++,python都能勝任

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

根據(jù)示例調(diào)試了一遍,順利調(diào)試通過(guò),學(xué)習(xí)了

0
回復(fù)
米修兒
LV.4
11
2021-12-22 15:01
@dy-q1PtffAR
vs確實(shí)是宇宙最強(qiáng)大編輯器,沒(méi)有之一,C++,python都能勝任

是的,是的,沒(méi)有VS干不了的事,現(xiàn)在新版本也是越來(lái)越強(qiáng)大了,但是占用資源也越來(lái)越大

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

有C基礎(chǔ),轉(zhuǎn)入C++基本可以無(wú)縫對(duì)接

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

你是用C高手,轉(zhuǎn)投C++so easy

0
回復(fù)
2021-12-22 15:09

HelloWorld @ 1 

Test @ 2

Add @ 3   這個(gè)里面的標(biāo)號(hào)是不是必須的,看有的程序里面沒(méi)有標(biāo)號(hào)

0
回復(fù)
米修兒
LV.4
15
2021-12-23 09:02
@晨風(fēng)
HelloWorld@1 Test@2Add@3  這個(gè)里面的標(biāo)號(hào)是不是必須的,看有的程序里面沒(méi)有標(biāo)號(hào)

我看很多教程上確實(shí)沒(méi)有標(biāo)號(hào),但是看很多前輩的程序里面都有標(biāo)號(hào),不知道是因?yàn)檫@樣更清晰還是因?yàn)樾枰?/p>

0
回復(fù)
2021-12-23 14:06

生成dll的時(shí)候,一定要記得跟C#選一樣的X64為平臺(tái),或者去掉首選32位,要不調(diào)試報(bào)錯(cuò)

1
回復(fù)
dy-SLPHrVRz
LV.1
17
2021-12-23 15:30

看過(guò)C++一直沒(méi)學(xué)好指針,文章寫(xiě)的通俗易懂,收藏了

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

寫(xiě)的很詳盡,遇到問(wèn)題了過(guò)來(lái)一起討論

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

很不錯(cuò)的教程,正好需要,先馬后看

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

C#確實(shí)強(qiáng)大,開(kāi)發(fā)Unity3D,開(kāi)發(fā)C++真的是無(wú)所不能

0
回復(fù)
2021-12-23 15:45

先順手收藏起來(lái),等有問(wèn)題方便過(guò)來(lái)查找討論

0
回復(fù)
米修兒
LV.4
22
2021-12-23 16:04
@dy-SLPHrVRz
C#確實(shí)強(qiáng)大,開(kāi)發(fā)Unity3D,開(kāi)發(fā)C++真的是無(wú)所不能

是的,Vs是真的強(qiáng)大,宇宙最強(qiáng)編輯器

0
回復(fù)
米修兒
LV.4
23
2021-12-23 16:08
@星球居民-6wBTmHfM
生成dll的時(shí)候,一定要記得跟C#選一樣的X64為平臺(tái),或者去掉首選32位,要不調(diào)試報(bào)錯(cuò)

我第一次調(diào)試的時(shí)候,雖然選了64位,但是忘了把首選32位去掉,結(jié)果編譯錯(cuò)誤

0
回復(fù)
米修兒
LV.4
24
2021-12-23 16:10
@dy-SLPHrVRz
看過(guò)C++一直沒(méi)學(xué)好指針,文章寫(xiě)的通俗易懂,收藏了

不好學(xué),但是很多人用的東西,一定有很多的過(guò)人之處,努力學(xué)習(xí)中

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

我也是邊學(xué)習(xí)邊記錄,下次需要就好找了

0
回復(fù)
米修兒
LV.4
26
2021-12-23 16:22
@星球居民-6wBTmHfM
先順手收藏起來(lái),等有問(wèn)題方便過(guò)來(lái)查找討論

我也是邊學(xué)習(xí),邊記錄,也方便自己查看,順便記錄也是學(xué)習(xí)的過(guò)程

0
回復(fù)
米修兒
LV.4
27
2021-12-23 16:29
@星球居民-6wBTmHfM
先順手收藏起來(lái),等有問(wèn)題方便過(guò)來(lái)查找討論

對(duì),先收藏,需要的時(shí)候好找,要不需要的時(shí)候找不到了

0
回復(fù)
#回復(fù)內(nèi)容已被刪除#
28
#回復(fù)內(nèi)容已被刪除#
29
dy-NCJU4yct
LV.1
30
2021-12-27 09:17

VS確實(shí)強(qiáng)大,竟然可以開(kāi)發(fā)python,有空摸索一下

0
回復(fù)
dy-NCJU4yct
LV.1
31
2021-12-27 09:27

重新開(kāi)始學(xué)習(xí),把大學(xué)拉掉的再學(xué)會(huì)來(lái)

0
回復(fù)
發(fā)
主站蜘蛛池模板: 贵溪市| 武强县| 岳西县| 康乐县| 分宜县| 和静县| 泉州市| 衡阳县| 雅江县| 瑞昌市| 麻城市| 宕昌县| 枞阳县| 岢岚县| 枣阳市| 罗定市| 黔江区| 望奎县| 绥宁县| 武胜县| 外汇| 高台县| 永丰县| 霍州市| 平遥县| 松桃| 运城市| 巍山| 绥德县| 平山县| 蓬安县| 罗江县| 曲阳县| 布尔津县| 台安县| 富川| 丰城市| 当涂县| 鲁山县| 微山县| 石狮市|