国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C#調(diào)用C++類,托管C++方式實現(xiàn)(創(chuàng)建C++ CLR dll項目)

這篇具有很好參考價值的文章主要介紹了C#調(diào)用C++類,托管C++方式實現(xiàn)(創(chuàng)建C++ CLR dll項目)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

????????由于C#編寫的是托管代碼,編譯生成微軟中間語言,而C++代碼則編譯生成本地機(jī)器碼(這種C++也有叫做本地C++或者非托管C++,VC6.0就是用于開發(fā)非托管C++代碼的平臺),這兩種語言進(jìn)行混合編程就存在一定困難。比較常用的方法是使用DllImport的方法,這種方法在網(wǎng)上有很多介紹,這里就不詳細(xì)敘述了。但是用過這種方法的人都知道這種方法對于導(dǎo)出函數(shù)還可以但是卻沒法導(dǎo)出非托管C++類!非常的要命。

????????然而,除了C#、非托管C++外,C系列中還存在一種語言叫做托管C++,這種語言語法上和非托管C++幾乎一樣,但是卻和C#一樣編譯成為微軟中間語言,這樣托管C++就可以和C#良好地通信,即可以在C#中使用托管C++類。另外,托管C++還有兩個及其重要的特性就是:可以調(diào)用非托管C++的類和函數(shù)!托管C++的程序集可以嵌套非托管C++編譯的機(jī)器碼!好強(qiáng)大的混合體。所以我們的技術(shù)路徑也就明晰了:C#以托管C++為中介調(diào)用非托管C++的類和函數(shù)。換句話說也就是用托管C++給非托管C++代碼做一個外殼包裝供C#調(diào)用。

? ? ? ? 換種方式解釋:C#調(diào)用C++的dll庫,如果調(diào)用C++的全局函數(shù)還好,估計可以直接調(diào)用,如果需要調(diào)用C++類里面的函數(shù),因為C#和C++是兩種不同的語言,兩者之間不能直接調(diào)用,他們之間需要一個橋梁,而托管C++可以充當(dāng)這個橋梁,這時需要創(chuàng)建一個C++ CLR dll,C#直接調(diào)用這個dll,間接調(diào)用原dll。

? ? ? ? 下面講解VS2017使用C#語言調(diào)用QT5.9.2 MSVC2017編譯生成的dll的步驟。

第一步:準(zhǔn)備普通的C++類庫,這里使用QT5.9.2 MSVC2017生成的.h、.lib、.dll,64位。

這里不再詳細(xì)敘述,dll導(dǎo)出的函數(shù)參數(shù)都是int、double等基本類型的。

第二步:VS2017創(chuàng)建C++ CLR項目,將普通C++dll重新封裝。

一、創(chuàng)建C++ CLR空項目。

C#調(diào)用C++類,托管C++方式實現(xiàn)(創(chuàng)建C++ CLR dll項目),c#,c++,開發(fā)語言二、注意改為與原C++ dll相同的64位

C#調(diào)用C++類,托管C++方式實現(xiàn)(創(chuàng)建C++ CLR dll項目),c#,c++,開發(fā)語言

三、原dll類庫相關(guān)文件準(zhǔn)備好,這里放在程序目錄下library文件夾下

C#調(diào)用C++類,托管C++方式實現(xiàn)(創(chuàng)建C++ CLR dll項目),c#,c++,開發(fā)語言C#調(diào)用C++類,托管C++方式實現(xiàn)(創(chuàng)建C++ CLR dll項目),c#,c++,開發(fā)語言四、.h和lib引入項目,debug和release分別引入

選中項目名稱,點擊“項目》屬性》VC++目錄》包含目錄”,設(shè)置.h所在文件夾

C#調(diào)用C++類,托管C++方式實現(xiàn)(創(chuàng)建C++ CLR dll項目),c#,c++,開發(fā)語言

選中項目名稱,點擊“項目》屬性》鏈接器》常規(guī)》附加庫目錄”,設(shè)置.lib所在文件夾

C#調(diào)用C++類,托管C++方式實現(xiàn)(創(chuàng)建C++ CLR dll項目),c#,c++,開發(fā)語言選中項目名稱,點擊“項目》屬性》鏈接器》輸入》附加庫依賴項”,設(shè)置.lib名稱

C#調(diào)用C++類,托管C++方式實現(xiàn)(創(chuàng)建C++ CLR dll項目),c#,c++,開發(fā)語言

五、項目屬性調(diào)整,調(diào)整為動態(tài)庫dll項目:

選中項目名稱,點擊“項目》屬性》常規(guī)》配置類型”,改為“動態(tài)庫”

選中項目名稱,點擊“項目》屬性》常規(guī)》公共語言運(yùn)行時支持”,改為“公共語言運(yùn)行時支持(/clr)”

“輸出目錄”、“目標(biāo)文件名”等,根據(jù)需要進(jìn)行修改。

C#調(diào)用C++類,托管C++方式實現(xiàn)(創(chuàng)建C++ CLR dll項目),c#,c++,開發(fā)語言

選中項目名稱,點擊“項目》屬性》C/C++》語言》符合模式”,確認(rèn)為“否”

六、添加一個空的.h和一個.cpp文件,命名隨意,這里命名為ManageCppDll.h,ManageCppDll.cpp。根據(jù)原dll的頭文件編寫這兩個文件的內(nèi)容。

C#調(diào)用C++類,托管C++方式實現(xiàn)(創(chuàng)建C++ CLR dll項目),c#,c++,開發(fā)語言

.h文件內(nèi)容

// ManageCppDll.h

#pragma once
#ifndef MANAGECPPDLL_H
#define MANAGECPPDLL_H

#include "sorter_filter.h"

/*
 * 請先初始化配置數(shù)據(jù)和計算數(shù)據(jù),然后再調(diào)用計算函數(shù)進(jìn)行計算
 */

public ref class ManageCppDll
{
public:
	ManageCppDll();
	~ManageCppDll();
	///
	/// \brief Init_SrcData:初始化導(dǎo)入計算數(shù)據(jù),OVector格式
	/// \param data_count:in,數(shù)據(jù)數(shù)量
	/// \param x_coordinate:in,X軸坐標(biāo)
	/// \param y_coordinate:in,Y軸坐標(biāo)
	/// \param sensor_up:in,上傳感器值
	/// \param sensor_down:in,下傳感器值
	///
	void Init_SrcData(int data_count, double* x_coordinate, double* y_coordinate, double* sensor_up, double* sensor_down);//初始化導(dǎo)入計算數(shù)據(jù)
	///
	/// \brief Init_SrcData_3D:初始化導(dǎo)入3D計算數(shù)據(jù),僅針對PCL點云移動最小二乘濾波,OVector<QVector>格式(Filter_PCL_MLS_3D函數(shù))
	/// \param lineCount:in,行數(shù)量
	/// \param columnCountEveryLine:in,每行數(shù)據(jù)數(shù)量
	/// \param x_coordinate:in,X軸坐標(biāo)
	/// \param y_coordinate:in,Y軸坐標(biāo)
	/// \param sensor_up:in,上傳感器值
	/// \param sensor_down:in,下傳感器值
	///
	void Init_SrcData_3D(int lineCount, int* columnCountEveryLine, double* x_coordinate, double* y_coordinate, double* sensor_up, double* sensor_down);//初始化導(dǎo)入3D計算數(shù)據(jù)

	//遞歸中值平均濾波參數(shù)設(shè)置
	///
	/// \brief Init_Median_ConfigData:遞歸中值平均濾波參數(shù)設(shè)置
	/// \param layernum:濾波層數(shù)(一般設(shè)置為1)
	/// \param windownum:窗口長度
	/// \param masknum:掩碼長度
	///
	void Init_Median_ConfigData(int layernum, int* windownum, int* masknum);//遞歸中值平均濾波參數(shù)設(shè)置
	///
	/// \brief Filter_Median:遞歸中值平均濾波,使用時先調(diào)用Init_SrcData導(dǎo)入待濾波數(shù)據(jù),再調(diào)用Init_Median_ConfigData設(shè)置濾波窗口相關(guān),最后調(diào)用此函數(shù)
	/// \param data_count:out,數(shù)據(jù)數(shù)量
	/// \param x_coordinate:out,X軸坐標(biāo)
	/// \param y_coordinate:out,Y軸坐標(biāo)
	/// \param sensor_up:out,上傳感器值
	/// \param sensor_down:out,下傳感器值
	/// \return
	///
	bool Filter_Median(int& data_count, double* &x_coordinate, double* &y_coordinate, double* &sensor_up, double* &sensor_down);//遞歸中值平均濾波

	//calman濾波
	///
	/// \brief Init_Calman_ConfigData:calman濾波參數(shù)設(shè)置
	/// * 當(dāng)我們更信任模型估計值時(模型估計基本沒有誤差),那么應(yīng)該讓Kg小一點,我們應(yīng)該將R取大一點,Q取小一點
	/// * 當(dāng)我們更信任觀測值時(模型估計誤差較大),那么應(yīng)該讓Kg大一點,我們應(yīng)該將R取小一點,Q取大一點
	/// \param Q
	/// \param R
	///
	void Init_Calman_ConfigData(double Q, double R);//calman濾波參數(shù)設(shè)置
	///
	/// \brief Filter_Calman
	/// \param data_count:out,數(shù)據(jù)數(shù)量
	/// \param x_coordinate:out,X軸坐標(biāo)
	/// \param y_coordinate:out,Y軸坐標(biāo)
	/// \param sensor_up:out,上傳感器值
	/// \param sensor_down:out,下傳感器值
	/// \return
	///
	bool Filter_Calman(int& data_count, double* &x_coordinate, double* &y_coordinate, double* &sensor_up, double* &sensor_down);//calman濾波

	//PCL-MLS(點云移動最小二乘濾波)相關(guān)
	///
	/// \brief Init_PCL_ConfigData:PCL移動最小二乘濾波參數(shù)設(shè)置
	/// \param MLSSearchRadius:最小二乘濾波半徑
	///
	void Init_PCL_ConfigData(double MLSSearchRadius);//PCL濾波參數(shù)設(shè)置
	///
	/// \brief Filter_PCL_MLS
	/// \param data_count:out,數(shù)據(jù)數(shù)量
	/// \param x_coordinate:out,X軸坐標(biāo)
	/// \param y_coordinate:out,Y軸坐標(biāo)
	/// \param sensor_up:out,上傳感器值
	/// \param sensor_down:out,下傳感器值
	/// \return
	///
	int Filter_PCL_MLS(int& data_count, double* &x_coordinate, double* &y_coordinate, double* &sensor_up, double* &sensor_down);//PCL移動最小二乘濾波;返回:0正常,<0異常
	///
	/// \brief Filter_PCL_MLS_3D
	/// \param lineCount:out,行數(shù)量
	/// \param columnCountEveryLine:out,每行數(shù)據(jù)數(shù)量
	/// \param x_coordinate:out,X軸坐標(biāo)
	/// \param y_coordinate:out,Y軸坐標(biāo)
	/// \param sensor_up:out,上傳感器值
	/// \param sensor_down:out,下傳感器值
	/// \return
	///
	int Filter_PCL_MLS_3D(int& lineCount, int* &columnCountEveryLine, double* &x_coordinate, double* &y_coordinate, double* &sensor_up, double* &sensor_down);//PCL移動最小二乘濾波;返回:0正常,<0異常

private:
	// 類SORTER_CALCULATION的指針,用來調(diào)用類SORTER_CALCULATION的成員函數(shù)
	SORTER_FILTER* m_pImp;
};

#endif // MANAGECPPDLL_H

.cpp文件內(nèi)容

// ManageCppDll.cpp

#include "ManageCppDll.h"
#include <vcclr.h>

	// 在構(gòu)造函數(shù)中創(chuàng)建類CPerson的對象并在析構(gòu)函數(shù)中將該對象銷毀
	// 所有的成員函數(shù)實現(xiàn)都是通過指針m_pImp調(diào)用類CPerson的相應(yīng)成員函數(shù)實現(xiàn)

ManageCppDll::ManageCppDll()
{
	m_pImp = new SORTER_FILTER();
}

ManageCppDll::~ManageCppDll()
{
	// 在析構(gòu)函數(shù)中刪除CPerson對象
	delete m_pImp;
}

//初始化導(dǎo)入計算數(shù)據(jù)
void ManageCppDll::Init_SrcData(int data_count, double* x_coordinate, double* y_coordinate, double* sensor_up, double* sensor_down)
{
	return m_pImp->Init_SrcData(data_count, x_coordinate, y_coordinate, sensor_up, sensor_down);
}
//初始化導(dǎo)入3D計算數(shù)據(jù)
void ManageCppDll::Init_SrcData_3D(int lineCount, int* columnCountEveryLine, double* x_coordinate, double* y_coordinate, double* sensor_up, double* sensor_down)
{
	return m_pImp->Init_SrcData_3D(lineCount, columnCountEveryLine, x_coordinate, y_coordinate, sensor_up, sensor_down);
}
//遞歸中值平均濾波參數(shù)設(shè)置
void ManageCppDll::Init_Median_ConfigData(int layernum, int* windownum, int* masknum)
{
	return m_pImp->Init_Median_ConfigData(layernum, windownum, masknum);
}
//遞歸中值平均濾波
bool ManageCppDll::Filter_Median(int& data_count, double* &x_coordinate, double* &y_coordinate, double* &sensor_up, double* &sensor_down)
{
	return m_pImp->Filter_Median(data_count, x_coordinate, y_coordinate, sensor_up, sensor_down);
}
//calman濾波參數(shù)設(shè)置
void ManageCppDll::Init_Calman_ConfigData(double Q, double R)
{
	return m_pImp->Init_Calman_ConfigData(Q, R);
}
//calman濾波
bool ManageCppDll::Filter_Calman(int& data_count, double* &x_coordinate, double* &y_coordinate, double* &sensor_up, double* &sensor_down)
{
	return m_pImp->Filter_Calman(data_count, x_coordinate, y_coordinate, sensor_up, sensor_down);
}
//PCL移動最小二乘濾波參數(shù)設(shè)置
void ManageCppDll::Init_PCL_ConfigData(double MLSSearchRadius)
{
	return m_pImp->Init_PCL_ConfigData(MLSSearchRadius);
}
//PCL移動最小二乘濾波
int ManageCppDll::Filter_PCL_MLS(int& data_count, double* &x_coordinate, double* &y_coordinate, double* &sensor_up, double* &sensor_down)
{
	return m_pImp->Filter_PCL_MLS(data_count, x_coordinate, y_coordinate, sensor_up, sensor_down);
}
//PCL移動最小二乘濾波
int ManageCppDll::Filter_PCL_MLS_3D(int& lineCount, int* &columnCountEveryLine, double* &x_coordinate, double* &y_coordinate, double* &sensor_up, double* &sensor_down)
{
	return m_pImp->Filter_PCL_MLS_3D(lineCount, columnCountEveryLine, x_coordinate, y_coordinate, sensor_up, sensor_down);
}

最后編譯生成dll。

第三步:在C#項目中調(diào)用,VS2017建立C#項目驗證。

這里創(chuàng)建 Winform項目驗證。注意原dll和CLR版的dll都要加入項目。

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;

namespace cs_call_cpp_dll
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        unsafe private void button1_Click(object sender, EventArgs e)
        {
            ManageCppDll calculation_dll = new ManageCppDll();
            calculation_dll.Init_ConfigData(4, 10, 2, 0, 0);
            double[] array_x = { 0, 1, 2, 3, 4 };
            double[] array_y = { 0, 1, 2, 3, 4 };
            double[] array_up = { 2, 2, 2, 2, 2 };
            double[] array_down = { 0, 1, 6, 3, 4 };
            int coordinate_count = 5;
            fixed (double* coordinate_x = &array_x[0]
                , coordinate_y = &array_y[0]
                , coordinate_up = &array_up[0]
                , coordinate_down = &array_down[0])
            {
                calculation_dll.Init_CoordinateData(coordinate_count, coordinate_x, coordinate_y, coordinate_up, coordinate_down);
            }
            double thickness, thickness_center;
            calculation_dll.Calculation_THICKNESS(&thickness, &thickness_center);
            calculation_dll.Calculation_THICKNESS(&thickness, &thickness_center);
        }
    }
}

注意,如果用到了指針,需要加入unsafe,并設(shè)置“允許不安全代碼”。double[]轉(zhuǎn)為double*時用到了fixed,注意fixed的使用方法,這里不再多說。

C#調(diào)用C++類,托管C++方式實現(xiàn)(創(chuàng)建C++ CLR dll項目),c#,c++,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-725698.html

到了這里,關(guān)于C#調(diào)用C++類,托管C++方式實現(xiàn)(創(chuàng)建C++ CLR dll項目)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Unity——在C#中調(diào)用C++動態(tài)鏈接庫(DLL)

    Unity——在C#中調(diào)用C++動態(tài)鏈接庫(DLL)

    1、新建C++空項目 打開VS,新建一個C++空項目,自命名項目名稱與位置。 2、配置項目屬性為動態(tài)鏈接庫 右鍵項目,點擊屬性,打開項目屬性頁,將常規(guī)中的配置類型改為動態(tài)庫(.dll)。 ?3、添加.h頭文件 右鍵頭文件,點擊添加—新建項,選擇頭文件.h,命名為DllForUnity.h,點擊

    2024年02月10日
    瀏覽(20)
  • C#調(diào)用C++封裝的SDK庫(dll動態(tài)庫)——下

    C#調(diào)用C++封裝的SDK庫(dll動態(tài)庫)——下

    一、說明 上一篇我們相當(dāng)于封裝的是C語言風(fēng)格的動態(tài)dll庫,供C#來調(diào)用的。 C#調(diào)用C++封裝的SDK庫(dll動態(tài)庫)——上 如果我們要封裝的是下面的類呢?我們該怎么辦?大家先思考下。 ?二、思路 不知道大家還記得設(shè)計模式中的單例模式嗎? 我們可以采用類似的處理方式,通過

    2023年04月25日
    瀏覽(16)
  • C#(.Net) 將非托管dll嵌入exe中

    C#(.Net) 將非托管dll嵌入exe中

    前往我的主頁以獲得更好的閱讀體驗 C#(.Net) 將非托管dll嵌入exe中 - DearXuan的主頁 https://blog.dearxuan.com/2021/12/26/C-Net-%E5%B0%86%E9%9D%9E%E6%89%98%E7%AE%A1dll%E5%B5%8C%E5%85%A5exe%E4%B8%AD/ 托管dll實際上是指C#編寫的dll,可以直接右鍵“引用”導(dǎo)入 而大部分情況下,我們需要引用C++寫的dll,如果你

    2024年02月08日
    瀏覽(22)
  • Visual Studio關(guān)于C#項目Dll的引用幾種方式

    Visual Studio關(guān)于C#項目Dll的引用幾種方式

    右鍵“引用”,點擊“添加引用”(Net Framework項目) 或者右鍵“依賴項”,點擊“添加項目引用” 打開“引用管理器”窗口,切換到“項目”一欄 在右側(cè)列表中,勾選需要引用的項目,然后點擊確定 推薦在解決方案文件夾下創(chuàng)建一個專門的文件夾用于存放外部引用的dll 右

    2024年02月02日
    瀏覽(21)
  • Unity調(diào)用微軟SpeechLib.Dll的C#類實現(xiàn)語音合成功能

    using System.Collections; using System.Collections.Generic; using UnityEngine; using SpeechLib; public class Speech : MonoBehaviour { // Start is called before the first frame update void Start() { } 將Interop.SpeechLib.dll文件導(dǎo)入Unity,然后把上面的腳本掛載到游戲?qū)ο笊暇湍軠y試語音合成的效果了。 經(jīng)測試 調(diào)用v.Speak這個方

    2024年02月13日
    瀏覽(32)
  • Visual Studto 2022 如何創(chuàng)建 C++ CLR Windows窗體應(yīng)用程序

    Visual Studto 2022 如何創(chuàng)建 C++ CLR Windows窗體應(yīng)用程序

    #include \\\"pch.h\\\" #include \\\"MyForm.h\\\" using namespace System; using namespace ConsoleApplication1; int main(arraySystem::String ^ ^args) { ? ? Windows::Forms::Application::Run( gcnew MyForm()); ? ? return 0; } ?

    2024年02月03日
    瀏覽(63)
  • CLR基礎(chǔ)全面版-概念、執(zhí)行模型、托管模塊、程序集、FCL

    CLR基礎(chǔ)全面版-概念、執(zhí)行模型、托管模塊、程序集、FCL

    概念:CLR Common Language Runtime 公共語言運(yùn)行時 顧名思義,是多編程語言共同使用的運(yùn)行時 微軟創(chuàng)建了很多個面向CLR的語言編譯器:C#,C++,F(xiàn)#等 CLR不關(guān)心運(yùn)用什么語言編寫源代碼,只需要編譯器面向CLR 編譯器:檢查語法,分析源代碼確定含義。不管是什么語言都會把代碼生成

    2024年02月03日
    瀏覽(52)
  • 自己開發(fā)jlink燒錄軟件,燒錄上位機(jī), C#調(diào)用JLinkARM.dll實現(xiàn)軟件燒錄

    自己開發(fā)jlink燒錄軟件,燒錄上位機(jī), C#調(diào)用JLinkARM.dll實現(xiàn)軟件燒錄

    最近需要寫一個燒錄軟件,讓工廠可以實現(xiàn)一鍵燒錄。 這里實現(xiàn)了運(yùn)行一個bat文件進(jìn)行一鍵燒錄,不想看這部分的可以直接跳到第二部分,不受影響。 由于jlink的自帶燒錄軟件JFlash.exe操作十分繁雜,需要自己開發(fā)一個簡潔的燒錄方法,一番操作發(fā)現(xiàn),可以使用J-Link Commander

    2024年04月11日
    瀏覽(24)
  • C#開發(fā)DLL,CAPL調(diào)用(CAPL>> .NET DLL)

    C#開發(fā)DLL,CAPL調(diào)用(CAPL>> .NET DLL)

    ret為dll里函數(shù)返回的值。 在visual studio中建立。

    2024年02月08日
    瀏覽(23)
  • C# DLL嵌套調(diào)用時修改生效

    C# DLL嵌套調(diào)用時,需要以被修改的DLL作為最下層,從下往上地重新生成所有DLL才可生效。 DLL1(最下層)代碼: DLL2(中間層)代碼: 應(yīng)用程序代碼: 實驗步驟: 1.在代碼無修改的情況下運(yùn)行應(yīng)用程序,輸出結(jié)果為A。 2.修改DLL1動態(tài)鏈接庫ConsoleWriteLineSomething方法,使其輸出

    2024年01月25日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包