我有一个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#中编写相同的东西。有什么想法吗?
答案 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
而不是StdCall
和Int16
而不是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 });
}