代码之家  ›  专栏  ›  技术社区  ›  unknownuser

C~*互操作:也可以是空的输出参数

  •  1
  • unknownuser  · 技术社区  · 15 年前

    考虑以下dllimport:

    [DllImport("lulz.so")]
    public static extern int DoSomething(IntPtr SomeParam);
    

    这实际上是在引用一个c风格的函数,如下所示:

    int DoSomething(void* SomeParam); 
    

    考虑SomeParam是一个“OUT”参数,但也可以是NULL。如果参数为空,c函数的行为就不同。所以我可能想:

    [DllImport("lulz.so")]
    public static extern int DoSomething(out IntPtr SomeParam);
    

    但是,如果在我的导入中使它成为一个Out-PARAM,我不能将它传递给NULL,也就是说我不能这样做:

    int retVal = DoSomething(IntPtr.Zero)
    

    我在这里有什么选择?

    5 回复  |  直到 15 年前
        1
  •  8
  •   Adam Robinson    15 年前

    如果你想传递一个值,那么 out 不是正确的关键字;将其更改为 ref . 您仍然需要显式传递变量,但它可以是 null 参考文献。

    例如。。。

    [DllImport("lulz.so")]
    public static extern int DoSomething(ref IntPtr SomeParam);
    

    你可以这样称呼它:

    IntPtr retVal = IntPtr.Zero;
    
    DoSomething(ref retVal);
    

    然而

    告诉你的是 外面的 裁判 ?路过 IntPtr 作为 外面的 裁判 就像传递一个双指针。实际上,将参数作为 小精灵

    典型的过程是在托管代码中分配必要的内存并传递 国际乒乓球联合会 表示分配的内存,或 IntPtr.Zero 表示空指针。你不需要通过 小精灵 作为 外面的 裁判 为了将数据发送回.net;您只需要在调用的函数实际上 更改指针地址

        2
  •  0
  •   recursive    15 年前

    我不明白问题是什么…

    这运行:

    private void button2_Click(object sender, EventArgs e) {
        object bar;
        Method(out bar);
    
        bar = IntPtr.Zero;
        Method(out bar);
    }
    
    private void Method(out object foo) {
        foo = null;
    }
    
        3
  •  0
  •   John Saunders    15 年前

    通过的目的是什么 NULL ?是否打算像往常一样调用该方法,而只是不设置输出参数?

    在这种情况下,我想我应该用c_中的重载来包装extern方法。超载(没有 out 参数)如下:

    public void DoSomething()
    {
        IntPtr dummy;
        DoSomething(out dummy);
    }
    
        4
  •  0
  •   Joshua    15 年前

    我遇到过一次。最后我自己整理了指针(参见 Marshal Members 以便库函数执行此操作)。

        5
  •  0
  •   elder_george    15 年前

    就我个人而言,我会导入这个函数两次,第一次使用'out'参数,第二次使用'in'。

    [DllImport("lulz.so")]
    public static extern int DoSomething(out IntPtr SomeParam);
    
    // call as DoSomethingWithNull(IntPtr.Zero)
    [DllImport("lulz.so", EntryPoint="DoSomething")]
    public static extern int DoSomethingWithNull(IntPtr SomeParam);
    

    这将解决您的问题,并使代码更可读。