Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C上写一个签名,用于在其参数上具有双重间接性的包裹C++方法?_C#_.net_C++_Interop_Dllimport - Fatal编程技术网

C# 如何在C上写一个签名,用于在其参数上具有双重间接性的包裹C++方法?

C# 如何在C上写一个签名,用于在其参数上具有双重间接性的包裹C++方法?,c#,.net,c++,interop,dllimport,C#,.net,C++,Interop,Dllimport,我正在为dll编写一个包装器。dll有一个签名类似于以下内容的方法: unsigned long aMethod(char **firstParameter, char **secondParameter)) aMethod返回所有参数的字符串指针 我在google上搜索了一个教程,让我深入了解如何在C上编写签名,这样框架就可以完成编组过程 怎么写呢? 你知道关于这个主题的任何教程、书籍或文档吗?并没有真正回答你的问题,但是有一个工具可以帮助你,如果你在.dll中有很多方法,你想从C调用它,那

我正在为dll编写一个包装器。dll有一个签名类似于以下内容的方法:

unsigned long aMethod(char **firstParameter, char **secondParameter))
aMethod返回所有参数的字符串指针

我在google上搜索了一个教程,让我深入了解如何在C上编写签名,这样框架就可以完成编组过程

怎么写呢?
你知道关于这个主题的任何教程、书籍或文档吗?

并没有真正回答你的问题,但是有一个工具可以帮助你,如果你在.dll中有很多方法,你想从C调用它,那就是swig。它让您可以从接口文件中围绕.dll生成一个包装器。学习如何做的一个方法就是学习swig是如何做的。

难道你不能把它写成

ulong aMethod(out IntPtr firstParameter, out IntPtr secondParameter);
要使用它:

IntPtr p1;
IntPtr p2;

aMethod(out p1, out p2);

string p1Str = Marshal.PtrToStringAnsi(p1);
string p2Str = Marshal.PtrToStringAnsi(p2);
当然,我假设您不想对该方法返回的实际内存进行操作。如果要对实际字节进行操作,可以调用Marshal.ReadByte,将收到的指针传递给它

请注意,如果被调用的方法在将这些字符串传递给您之前为其分配内存,则会出现内存泄漏,除非您可以调用该API中的某些内容来释放内存

还要注意的是,如果您直接在字节上操作,则无法保证API中的其他内容不会从您下面拉出地毯。

我得到了答案:

签名必须如下所示:

[DllImport(aDll.dll, CallingConvention = CallingConvention.Cdecl, 
    CharSet = CharSet.Auto)]
static unsafe extern ulong aMethod(ref IntPtr firstParameter, 
    ref IntPtr secondParameter);
参数应声明如下:

IntPtr firstParameter = new IntPtr();
IntPtr secondParameter = new IntPtr();
调用的方式如下:

aMethod(ref firstParameter, ref secondParameter);
与字符串相关的编组和解编组如下:

Marshal.PtrToStringAnsi(firstParameter)
Marshal.PtrToStringAnsi(secondParameter)
显然,这种编组是根据dll的API约定选择的


我不确定,但所有问题都源于Charset和CallingConvention选项…

您实际上想从托管代码调用此方法吗?char*的可能副本不是指向函数的指针。我也没有看到任何双重间接…@dtb抱歉。。。我现在已经更正了这个问题……那么,您对marshaller可能感兴趣的方法参数了解多少?例如,您知道这些参数的目的是什么吗?它们都是变量的地址,包含一个以null结尾的字符串,实现为指向char的指针,还是什么?谢谢!你告诉我如何使用指针的编组和解编组