最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#與C++動態(tài)鏈接庫DLL參數(shù)互傳方式

 更新時間:2022年11月08日 09:08:00   作者:weixin_46846685  
這篇文章主要介紹了C#與C++動態(tài)鏈接庫DLL參數(shù)互傳方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

一、C#中導入C++動態(tài)鏈接庫

從界面程序開發(fā)的角度來說,C#語言效率較C++高,且通過WPF開發(fā)出的程序界面更為美觀,但在開發(fā)實際項目中有時不可避免的需要使用C++程序庫,通常的做法是將C++程序編譯為動態(tài)鏈接庫,及DLL文件,然后在C#中進行導入調(diào)用。

導出C++程序通常的做法是使用_declspec(dllexport) /_declspec(dllimport)來導入導出,C++示例代碼如下:

#include <iostream>
using namespace std;
extern "C" _declspec(dllexport) void TestDll(char* Path, char* result);
_declspec(dllexport) void TestDll(char* Path, char* result)
{
***//函數(shù)功能具體實現(xiàn)
}

以VS2019中編譯Dll為例,打開項目屬性窗口,點擊配置屬性——常規(guī),將配置類型選擇為動態(tài)庫(.dll),然后點擊配置屬性——高級,將目標文件擴展名選擇為.dll,然后設(shè)置好解決方案配置和平臺后生成dll文件。

導出為Dll文件后,例如導出文件名為TestDll.dll,在C#中調(diào)用示例代碼如下:

[DllImport("TestDll.dll", EntryPoint = "TestDll")]
static extern void TestDll(string Path, [Out, MarshalAs(UnmanagedType.LPArray)] char[] result);

下面具體講如何在C#與C++之間實現(xiàn)參數(shù)傳遞。

二、C#傳入字符串參數(shù)

參數(shù)傳遞主要涉及C#調(diào)用dll文件時傳入dll參數(shù)和調(diào)用結(jié)束dll文件傳出參數(shù)。通常傳入dll的參數(shù)類型為整數(shù)類型,整數(shù)數(shù)組類型和字符串類型。

在C#和C++中整數(shù)類型通常都為int類型,在參數(shù)傳入時直接傳入即可。

但對于字符串類型,C#中為string類型,而C++中通常是使用字符數(shù)組來存儲字符串,即char[]或char*類型,而C++中也使用std::string類型來存儲字符串,但在實際使用過程中發(fā)現(xiàn)當C++中接收參數(shù)類型是該類型時會報出錯誤,

示例代碼如下:

//C++代碼
#include <iostream>
using namespace std;
extern "C" _declspec(dllexport) void TestDll(char* Path);
_declspec(dllexport) void TestDll(char* Path)
{
***//函數(shù)功能具體實現(xiàn)
}
//C#代碼
[DllImport("TestDll.dll", EntryPoint = "TestDll")]
static extern void TestDll(string Path);
string path = "hello";
TestDll(path);

上述代碼中,C#傳入字符串類型為string類型,而C++接收參數(shù)類型為char*類型,經(jīng)實際測試,中文字符和英文字符都可以正確傳輸。

三、C++傳出字符串參數(shù)

C++傳出字符串參數(shù)較C#傳入更為復雜,因C++中字符存儲是以指針形式,所以可以通過如下方式來實現(xiàn):C#傳入一個數(shù)組參數(shù),傳入后C++對該數(shù)組指針進行賦值,然后傳出。

實現(xiàn)方式有兩種,一種為C#傳入char數(shù)組類型,一種為C#傳入byte數(shù)組類型,示例代碼如下:

//C++代碼
#include <iostream>
using namespace std;
extern "C" _declspec(dllexport) void TestDll(char* result);
_declspec(dllexport) void TestDll(char* result)
{
char s[20]="hello";
memcpy(result, s, strlen(s));
}

memcpy為C++內(nèi)存拷貝函數(shù),使用時需要注意strlen與sizeof函數(shù)的區(qū)別,兩者都是獲得變量的字節(jié)數(shù),不同的是strlen只適用于char*類型,當遇到’\0’字節(jié)時停止計數(shù),而sizeof適用于多種類型和對象,當用于數(shù)組類型時獲得的時初始化時分配的字節(jié)數(shù),而不是實際使用的字節(jié)數(shù)。

//C#代碼
[DllImport("TestDll.dll", EntryPoint = "TestDll")]
static extern void TestDll([Out, MarshalAs(UnmanagedType.LPArray)] char[] result);
char[] result = new char[100];
TestDll(result);
string re = new string(result);
Console.WriteLine(re);

在C#中傳入char[]即字符數(shù)組類型,待C++中對result賦值完成后再取出result,對字符串re賦值,這樣就實現(xiàn)了C++字符串參數(shù)的傳出。

需要注意的是在C#中數(shù)組是直接使用的,而在C++中返回的是數(shù)組的指針,[Out, MarshalAs(UnmanagedType.LPArray)]用來轉(zhuǎn)化這兩種不同的類型。

上述實現(xiàn)方式為傳入char數(shù)組類型方式,但如果C++傳出的字符串包含中文字符,那么可能在C#中會顯示亂碼,因為中文字符為UTF-8編碼。

下面介紹使用byte數(shù)組方式,C++中代碼不變,C#中代碼如下:

//C#代碼
[DllImport("TestDll.dll", EntryPoint = "TestDll")]
static extern void TestDll(ref byte t);
byte[] t = new byte[100];
TestDll(path, ref t[0]);
string re = Encoding.UTF8.GetString(t);
Console.WriteLine(re);

byte數(shù)組方式傳輸中文字符不算出現(xiàn)亂碼情況。

四、C++傳出vector<char*>參數(shù)

vector類型為C++中類似于列表的數(shù)據(jù)類型,能夠自由添加、插入、刪除元素,與C#中List類型功能相似。

但當要在C++傳出vector類型時,在C#端的接收數(shù)據(jù)類型卻不能為List,否則會報出錯誤,而應該使用C#中的IntPtr類型,示例代碼如下:

//C++代碼
#include <iostream>
using namespace std;
extern "C" _declspec(dllexport) void TestDll(int& num, char** &result);
_declspec(dllexport) void TestDll(int& num, char** &result)
{
std::vector<char*> res;
char* tmp = new char[5];
char s[20]="hello";
memcpy(tmp, s, strlen(s));
res.push_back(tmp);
num = 1;
result = res.data();
}

在上述C++代碼中主要通過res.data()函數(shù)實現(xiàn)將vector<char*>類型轉(zhuǎn)換為char**類型,從而方便C#端讀取,而num變量而表示vector類型的元素個數(shù),C#端代碼如下:

//C#代碼
[DllImport("TestDll.dll", EntryPoint = "TestDll")]
static unsafe extern void TestDll(ref int num, ref IntPtr t);
int num = 0;
IntPtr data = IntPtr.Zero;
TestDll(ref num, ref data);
for (int i = 0; i < num; ++i)
{
   int size = Marshal.SizeOf(typeof(IntPtr));
   IntPtr intPtr = Marshal.ReadIntPtr(data, size * i);
   string datastr = Marshal.PtrToStringAnsi(intPtr);
   Console.WriteLine(datastr);
}

C#代碼中根據(jù)num個數(shù)依次從內(nèi)存中讀取字符串,從內(nèi)存中讀取字符串函數(shù)為Marshal.PtrToStringAnsi(intPtr),需要注意的是如果C++傳出的包含中文字符,那么在C#端可能顯示亂碼。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#實現(xiàn)將程序運行信息寫入日志的方法

    C#實現(xiàn)將程序運行信息寫入日志的方法

    這篇文章主要介紹了C#實現(xiàn)將程序運行信息寫入日志的方法,可實現(xiàn)將程序運行信息寫入日志并存儲在Debug目錄下的"/Log/PRG"下的功能,涉及C#針對日志的相關(guān)寫入技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • C#實現(xiàn)Json轉(zhuǎn)DataTable并導出Excel的方法示例

    C#實現(xiàn)Json轉(zhuǎn)DataTable并導出Excel的方法示例

    這篇文章主要介紹了C#實現(xiàn)Json轉(zhuǎn)DataTable并導出Excel的方法,結(jié)合實例形式總結(jié)分析了Json轉(zhuǎn)換DataTable,以及DataTable導出Excel相關(guān)操作技巧,需要的朋友可以參考下
    2019-02-02
  • C#創(chuàng)建一個小型Web Server(Socket實現(xiàn))

    C#創(chuàng)建一個小型Web Server(Socket實現(xiàn))

    這篇文章主要介紹了關(guān)于C#利用Socket實現(xiàn)創(chuàng)建一個小型Web Server的相關(guān)資料,文中通過示例代碼介紹的很詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • C#中實現(xiàn)AES算法加密解讀

    C#中實現(xiàn)AES算法加密解讀

    這篇文章主要介紹了C#中實現(xiàn)AES算法加密實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#中IList<T>與List<T>的區(qū)別深入解析

    C#中IList<T>與List<T>的區(qū)別深入解析

    本篇文章主要是對C#中IList<T>與List<T>的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#9特性record 類型、模式匹配、init 屬性詳情

    C#9特性record 類型、模式匹配、init 屬性詳情

    這篇文章主要介紹了C#的record 類型、模式匹配(Pattern Matching)、屬性的 init 訪問器三大特性,感興趣的小伙伴請參考下面文章內(nèi)容
    2021-09-09
  • C#使用JsonConvert全面解析JSON

    C#使用JsonConvert全面解析JSON

    這篇文章主要介紹了C#使用JsonConvert全面解析JSON,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • C#實現(xiàn)將批量圖片轉(zhuǎn)為PDF文件

    C#實現(xiàn)將批量圖片轉(zhuǎn)為PDF文件

    這篇文章主要為大家詳細介紹了如何使用 iTextSharp 庫實現(xiàn),將指定目錄下的有序的一組圖片,組合生成指定文件名的PDF文件,有需要的可以了解下
    2024-10-10
  • C#?手寫識別的實現(xiàn)示例

    C#?手寫識別的實現(xiàn)示例

    本文主要介紹了C#?手寫識別的實現(xiàn)示例,文章詳細介紹了如何使用C#語言調(diào)用OpenCV庫實現(xiàn)手寫識別,并通過示例程序展示了整個手寫識別過程,感興趣的可以了解一下
    2023-08-08
  • 如何獲取C#中方法的執(zhí)行時間以及其代碼注入詳解

    如何獲取C#中方法的執(zhí)行時間以及其代碼注入詳解

    這篇文章主要給大家介紹了關(guān)于如何獲取C#中方法的執(zhí)行時間以及其代碼注入的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2018-11-11

最新評論

册亨县| 开江县| 东海县| 沅江市| 余干县| 崇明县| 秦皇岛市| 封丘县| 衢州市| 郴州市| 阜康市| 夏津县| 板桥市| 怀柔区| 十堰市| 湟源县| 蓬莱市| 佛冈县| 福海县| 河津市| 漾濞| 鸡西市| 云和县| 徐汇区| 东乌珠穆沁旗| 横峰县| 如皋市| 鄂托克旗| 措勤县| 盈江县| 青铜峡市| 娱乐| 义乌市| 长白| 无棣县| 寿光市| 昂仁县| 文登市| 高青县| 沅江市| 子长县|