【问题标题】:C# DLL extern prototype helpC# DLL extern 原型帮助
【发布时间】:2010-11-06 07:13:13
【问题描述】:

我有一个 C DLL,其导出如下所示:

__declspec(dllexport) int Function(
    char *password,
    unsigned char *ssid,
    int ssidlength,
    unsigned char *output)
{

在 C# 方面,我使用如下:

[DllImport("myDLL.dll", SetLastError = true)]
protected static extern int Function(
    [MarshalAs(UnmanagedType.LPStr)] 
    string password,
    [MarshalAs(UnmanagedType.LPStr)] 
    string ssid,
    int ssidlength,
    [MarshalAs(UnmanagedType.LPArray)]
    byte[] output);

上面的内容实际上工作得很好,但我花了一段时间才弄清楚我需要什么东西来编组。是否有任何指南仅列出所有可能的 c/cpp 数据类型及其等效的 C# Marshalling?

类似:
c => C#
Char *myVar => [MarshalAs(UnmanagedType.LPStr)] 字符串 myVar
...
但列出所有类型?

我问的原因是因为我不知道何时使用“ref”或 out 或 IntPtr,或者将某些内容编组为什么类型。

最后,在上面的代码中,我将一个指向 unsigned char 数组的指针编组为指向字符串的长指针。这似乎不对,但它确实有效。以 byte[] 数组结尾更有意义,但我无法让它工作。如果只有我可以使用的在线参考...

【问题讨论】:

  • 主要技巧是您可以使用 IntPtr 代替任何指针。而且通常使用它而不是 out 或 ref 关键字要好得多,因为在调用函数时可以将许多参数留空。

标签: c# marshalling


【解决方案1】:

MSDN 上有很多指南。

话虽如此,pinvoke.netPInvoke Interop Assistant 是处理原生代码的绝佳资源。

尤其是互操作助手,通常使这变得非常容易。

【讨论】:

    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2011-05-26
    相关资源
    最近更新 更多