typedef void *替代c#

时间:2015-12-09 08:13:16

标签: c# c pinvoke

我正在使用C语言编写的DLL运行时到C#中。 我在下面发表声明。

 typedef void *JCCP_PROPERTY_HANDLE;

在功能中,它被用作:

JCCP_RESULT  __JCCP_FUNCTION__ jccpGetProperty(
    JCCP_HANDLE hjccp,
    const char *name,
    JCCP_PROPERTY_HANDLE *phproperty);

现在我想在我的C#代码中调用jccpGetProperty()方法。 任何人都可以告诉我如何从C#传递第三个参数(JCCP_PROPERTY_HANDLE * phproperty)。

我尝试使用以下代码,但没有工作。

外部方法:

 [DllImport(DLL_NAME, EntryPoint = "_jccpGetProperty", CallingConvention = CallingConvention.Cdecl)]
 public static extern IntPtr jccpGetProperty(IntPtr hjccp, string name, ref IntPtr JCCP_PROPERTY_HANDLE);

用法

IntPtr handle = IntPtr.Zero;
string tag = "server.version";
var result = jccpGetProperty(hjccp, tag, ref handle);

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

IntPtrvoid*的正确类型映射。本机类型void*通常用于不透明指针,并在C#中映射到IntPtr

我们可以验证的p / invoke声明的那些部分是正确的。无法辨认的部分是:

  • 调用约定。您认为它是cdecl,但我们无法检查。
  • 返回类型。你认为它是指针大小。我们再次无法检查。我的猜测是32位整数,intuint更有可能。这将在64位进程中产生影响。
  • 传递给函数的值。完全可能正确地声明了该函数,但是您传递的是无效值。

因为你只展示了部分代码和细节,所以很难说更多。您必须验证我们不能的程序的所有部分。

我建议你从使用C或C ++代码开始并转换它,寻找代码和C#转换之间行为的第一个偏差点。