在C#中调用此C函数的正确语法是什么?该函数使用指针和数组

在C#中调用此C函数的正确语法是什么?该函数使用指针和数组,c#,python,c,pointers,dllimport,C#,Python,C,Pointers,Dllimport,我试图从用C编写的DLL调用函数。我需要用C#调用函数,但我相信我遇到了语法问题。我有一个使用Python库的工作示例。不幸的是,DLL需要一个加密狗才能运行,所以现在我正在寻找有关C、Python和C#之间语法上任何明显差异的帮助 C函数的格式为 int(int-nID,int-nororientation,double*pMTFVector,int*pnVectorSize) (我真的不熟悉指针,PDF文档中的星号被空格包围,所以我不确定星号应该附加到什么上) 此代码的功能是接受nID和NO

我试图从用C编写的DLL调用函数。我需要用C#调用函数,但我相信我遇到了语法问题。我有一个使用Python库的工作示例。不幸的是,DLL需要一个加密狗才能运行,所以现在我正在寻找有关C、Python和C#之间语法上任何明显差异的帮助

C函数的格式为

int(int-nID,int-nororientation,double*pMTFVector,int*pnVectorSize)
(我真的不熟悉指针,PDF文档中的星号被空格包围,所以我不确定星号应该附加到什么上)

此代码的功能是接受nID和NORITIONATION以指定图像中的特征,然后用值填充数组。文件描述了以下输出:

out; pMTFVector; array of MTF values, memory is allocated and handled by application, size is given by pnVectorSize

in,out; pnVectorSize maximum number of results allowed to store in pMTFVector, number of results found and stored in pMTFVector
实际有效的python代码是:

lib=cdll.LoadLibrary("MTFCameraTester.dll")
lib.MTFCTGetMTF(c_uint(0), c_int(0), byref((c_double * 1024)()), byref(c_uint(1024)))
我尝试过的代码是:

 [DllImport("MTFCameraTester.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public extern static MTFCT_RETURN MTFCTGetMTF(UInt32 nID, int orientation, double[] theArray, IntPtr vectorSize);

        double[] myArray = new double[1024];
        IntPtr myPtr = Marshal.AllocHGlobal(1024);
        returnEnum = MTFCTGetMTF(0, 0, myArray, myPtr);

运行代码时,my
returnEnum
-1
,在文档中指定为错误。这是我遇到的最好的结果,因为在尝试
ref
out
的不同组合时,我遇到了许多堆栈溢出错误,您几乎做到了。最后一个论点是我认为的问题。试着这样做:

[DllImport("MTFCameraTester.dll", CallingConvention = CallingConvention.Cdecl)]
public extern static MTFCT_RETURN MTFCTGetMTF(
    uint nID,
    int orientation,
    [Out] double[] theArray, 
    ref int vectorSize
);

....

double[] myArray = new double[1024];
int vectorSize = myArray.Length;
MTFCT_RETURN returnEnum = MTFCTGetMTF(0, 0, myArray, ref vectorSize);

有效的VB.NET解决方案是:

   <DllImport("MTFCameraTester.dll", CallingConvention:=CallingConvention.Cdecl)> _
    Function MTFCTGetMTF(ByVal id As UInt32, ByVal orientation As UInt32, ByRef data As Double, ByRef len As UInt32) As Integer
    End Function

    Dim ret As Integer
    Dim dat(1023) As Double
    Dim len As UInt32 = 1024
    ret = MTFCTGetMTF(0, 0, dat(0), len)
_
函数MTFCTGetMTF(ByVal id为UInt32,ByVal方向为UInt32,ByRef data为Double,ByRef len为UInt32)为整数
端函数
Dim ret作为整数
尺寸dat(1023)为双精度
尺寸透镜组件UInt32=1024
ret=MTFCTGetMTF(0,0,dat(0),len)

似乎我必须将数组的第一个元素传递给C函数,然后它会处理其余的元素。

数组已经被编组为指向第一个元素的指针。所以我认为,
ByRef theArray()As Double
应该是
theArray()As Double
。谢谢你的建议。我将编辑原始问题的底部,因为我不确定如何清晰地格式化评论。我已将问题转换为C,因为这似乎是我在搜索帮助时遇到的最常见的语言。我还从文档中添加了更多关于输入/输出和函数用途的信息。这一点都不正确。您需要将数组声明为数组。我也不相信语法,但它正确地填充了我的dat数组。我不确定文档是否有错误,但这段代码适用于我调用的函数。我接受了你的答案,因为你的语法是有意义的,应该是有效的,但是代码本身返回了一个错误。