将 c++ dll 的 char 指针数组传递给 c# 字符串

Posted

技术标签:

【中文标题】将 c++ dll 的 char 指针数组传递给 c# 字符串【英文标题】:passing char pointer array of c++ dLL to c# string 【发布时间】:2012-09-20 09:26:35 【问题描述】:

考虑下面的 c++ 代码

#include "stdafx.h"
    #include<iostream>
    using namespace std;


this much part i want in c#..

void ping(int,char* d[]);

    void ping(int a,char *b[])
    
    int size;
    size=sizeof(b)/sizeof(int); // total size of array/size of array data type

    //cout<<size; 
        for(int i=0;i<=size;i++)
        cout<<"ping "<<a<<b[i]<<endl;
    

以下部分是c++

int _tmain(int argc, _TCHAR* argv[])

    void (*funcptr)(int,char* d[]);

    char* c[]="a","b";
    funcptr= ping;
    funcptr(10,c);

    return 0;

我如何在 c# 中实现相同的.. 我是 C# 新手。我如何在 c# 中拥有 char 指针数组?

【问题讨论】:

这会有所帮助:http://msdn.microsoft.com/en-us/library/ezftk57x.aspx sizeof(b)/sizeof(int) - 这不是很好的 C++ 代码。不要拿它当例子。 @HenkHolterman 是的,你是对的,我走错路了 :) 谢谢! @HenkHolterman 再次感谢您 -1 - 您在整个线程中的 cmets 暗示的主题与您的 OP 中的主题完全不同。 【参考方案1】:

您通常避免使用char*char[] 来支持string 类。如果你想要一个字符串数组,你可以使用string[] d,而不是char* d[],如果你想要一个字符列表,你可以使用简单的string d

C++ 和 C# 之间的互操作总是很棘手。一些不错的参考资料包括Pass C# string to C++ and pass C++ result (string, char*.. whatever) to C# 和Using arrays and pointers in C# with C DLL。

【讨论】:

字符串肯定会替换 char[],因为它毕竟是一个字符数组?顺便说一句,我很可能是错的,我只是在问。 @DeeMac 这取决于 james 想要字符串列表还是单个字符串。我已经适当地澄清了答案。 我想要数组中所有内容的列表 @James 您是想将 char*d[] 传递给 C# 方法(如在 C++ 到 C# 互操作中)还是只是在 C# 中实现类似的概念? @James 请重述这个问题,具体说明这一点。这个问题(对我来说)就像您试图在 C# 中表示相同的概念一样。【参考方案2】:

string 是一个字符列表。随着您提到字符操作和循环的使用,我假设您关心的是从一个列表/数组中定位特定字符 - 从这个意义上说,您可以在从 string 询问特定字符时几乎相同地编码(好像它是一个char 数组)。

例如:

string testString = "hello";
char testChar = testString[2];

在这种情况下,testChar 将等于 'l'。

【讨论】:

【参考方案3】:

首先,您的“C++”代码实际上是 C 和糟糕的 C - 它根本无法正确执行。 sizeof(b)不会给你数组的大小或类似的东西,它会给你一个指针的大小。考虑在尝试转换为 C# 之前编写一些正确的 C++。

template<int N> void ping(int a, std::array<std::string, N>& arr) 
    for(int i = 0; i < N; i++) std::cout << a <<  arr[i] << "\n";

int _tmain(int argc, _TCHAR* argv[]) 
     std::array<std::string, 2> c =  "a", "b" ;
     ping(10, c);
    return 0;

C# 没有静态大小的数组,但其余的很容易完成

public static void ping(int a, string[] arr) 
    for(int i = 0; i < arr.Length; i++) 
         System.Console.Write(a);
         System.Console.Write(arr[i]);
    

public static void Main(string[] args) 
    string[] arr =  "a", "b" ;
    ping(10, arr);

【讨论】:

你没有得到我的问题..我想将 c++ 的 char *arr[] 复制到 c# 的字符串 arr[] @james:然后编辑你的问题,它写得非常糟糕。 ***.com/questions/12511109/…【参考方案4】:

这应该对您有所帮助,尽管请注意输出缓冲区的大小是固定的,因此这不适用于动态大小的字符串,您需要事先知道大小。

public unsafe static void Foo(char*[] input)

    foreach(var cptr in input)
    
        IntPtr ptr = new IntPtr(cptr);
        char[] output = new char[5]; //NOTE: Size is fixed
        Marshal.Copy(ptr, output, 0, output.Length);

        Console.WriteLine(new string(output));
    

记住允许不安全代码,因为这是在 C# 中使用固定指针的唯一方法(右键单击项目、属性、构建、允许不安全代码)。

下次要更具体、更清楚,并尽量对这里的人表现得更加尊重,我们不会因为帮助你知道而得到报酬:-)

【讨论】:

【参考方案5】:

我们可以这样做

在 DLL 中我们将拥有

    extern "C" __declspec(dllexport) void  __stdcall Caller() 
         


        static char* myArray[3];

        myArray[0]="aasdasdasdasdas8888";

        myArray[1]="sssss";


        FunctionPtr1(2,myArray);


     





and in C# i just added following lines

 public static void ping(int a, IntPtr x)
        

            Console.WriteLine("Entered Ping Command");
              //code to fetch char pointer array from DLL starts here
              IntPtr c = x;
               int j = 0;
               string[] s = new string[100]; //I want this to be dynamic 
               Console.WriteLine("content of array");
               Console.WriteLine("");

            do
            
                s[j] = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(c, 4 * j));
                Console.WriteLine(s[j]);
                j++;

             while (s[j - 1] != null);
            //**********end****************

            Console.WriteLine("Integer value received from DLL is "+a);

        

【讨论】:

以上是关于将 c++ dll 的 char 指针数组传递给 c# 字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 DLL 将 C# StringBuilder / 字符串传递给 C++ char*

将 char*[] 从 c++ dll Struct 传递给 c#

将 C++ 结构指针从 Perl 传递给任意 dll 函数调用

C#调用C++的dll库怎么传递结构体中不定长度的char数组

将 char 指针数组传递给函数

如何将 C# 中的二维数组传递给 C++ DLL?