C# 如何在C上写一个签名,用于在其参数上具有双重间接性的包裹C++方法?
我正在为dll编写一个包装器。dll有一个签名类似于以下内容的方法: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调用它,那
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的指针,还是什么?谢谢!你告诉我如何使用指针的编组和解编组