C#接收C++動態庫返回字串char*,在C#端如何接收並得到正確的字串
最近呼叫動態庫傳資料,發現C#接收C++動態庫返回字串char*,在C#端設定對應型別為string無法接收到正確值,最後想到在C#端先用位元組陣列接收返回的字串,然後再將位元組陣列轉換為對應的字串,資料接收終於正確 首先開啟VS2012,新建專案->Visual C++,選擇Win32專案,如圖選擇dll 這裡寫圖片描述 新建專案的名字為dlltest,新建標頭檔案dlltest.h,在原始檔dlltest.cpp中加入如下程式碼:
#include "stdafx.h" #include "dlltest.h" char s[20]="您好hahaha"; int __stdcall test(char* str) { char attr[1024]; memset(attr,0,sizeof(attr)); memcpy(attr,s,sizeof(s)); memcpy(str,attr,sizeof(attr)); return 1; }
1 2 3 4 5 6 7 8 9 10 11
在dlltest.h中加入:
extern "C" _declspec(dllexport) int __stdcall test(char* str);
1
執行環境為debug模式,點選生成解決方案,在debug檔案下可看到生成了dlltest.dll,這就是動態庫檔案。 這裡寫圖片描述
開啟VS2012,新建Visual C#控制檯應用程式,命名為dlltestC 新建類檔案Class1.cs,啟動程式,執行空專案(debug模式),生成exe檔案,開啟exe所在目錄,將之前生成的dll複製到該目錄下,如圖。 這裡寫圖片描述 然後在Class1.cs中加入如下程式碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices;
namespace dlltestC { public class Class1 { [DllImport("dlltest.dll", EntryPoint = "test")] public extern static int test(ref byte str);
} }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
最後在Program.cs中加入:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace dlltestC { public class Program { static void Main(string[] args) { byte[] s = new byte[1024]; int t = Class1.test(ref s[0]);//用位元組陣列接收動態庫傳過來的字串 string strGet = System.Text.Encoding.Default.GetString(s, 0, s.Length); //將位元組陣列轉換為字串 Console.WriteLine(strGet);
} } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
執行該程式,輸出:您好hahaha --------------------- 作者:努力的菇涼 來源:CSDN 原文:https://blog.csdn.net/qq_22889875/article/details/78670172 版權宣告:本文為博主原創文章,轉載請附上博文連結!