1. 程式人生 > >C#接收C++動態庫返回字串char*,在C#端如何接收並得到正確的字串

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 版權宣告:本文為博主原創文章,轉載請附上博文連結!