相当于c#.net中的C typedef

时间:2014-10-31 07:46:11

标签: c# typedef

我有一个C代码:

typedef void (* FPS_PositionCallback) ( unsigned int   devNo,
                                    unsigned int   length,
                                    unsigned int   index,
                                    const double * const positions[3],
                                    const bln32  * const markers[3]   );

我需要在C#中编写相同的东西。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您需要定义一个代理并使用UnmanagedFunctionPointer

进行标记

e.g。

之类的东西
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void FPS_PositionCallback(
    Int32 devNo, 
    Int32 length,
    Int32 index, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)]double[] positions, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)]double[] markers);

我假设bln32是双倍的,但您可能还需要CDecl而不是StdCallInt16而不是Int32

然后你可以将它传递给你的c函数,例如可能会像这样声明的东西

[DllImport("FPSLIB.dll")]
public static extern void setPositionCallback([MarshalAs(UnmanagedType.FunctionPtr)] FPS_PositionCallback callbackPointer);

然后执行例如。

FPS_PositionCallback callback =
    (devNo, length, index, positions, markers) =>
    {
    };

setPositionCallback(callback);

你可能会做很多事情来完全正确。

答案 1 :(得分:0)

不是在C#中定义函数指针,而是定义一个委托来描述它可以容纳的方法。在您的情况下,这可能看起来像:

// define the delegate
public delegate void FPS_PositionCallback(
        int   devNo,
        int   length,
        int   index,
        double[] positions,
        double[] markers);

然后你可以像使用你的函数指针typedef和reference一样使用你的委托并用它执行一个方法:

    // the method you want to call with the delegate
    public void Method(int devNo, int length, int index, double[] positions, double[] markers);

    public void DoSomething()
    {
        // store a reference to the function with your delegate
        FPS_PositionCallback callback = this.Method;
        // call the method via the delegate
        callback(1, 1, 1, new[]{ 1 }, new[]{ 2 });
    }