C#如何从C调用函数++;动态链接库

C#如何从C调用函数++;动态链接库,c#,c++,dll,C#,C++,Dll,我有以下在dll文件中实现的代码 typedef签名的uu int16 TS_元素; 类型定义TS_元素*TS_数据; LIBTERAVIEW_API TS_RES tsRead(TS_数据缓冲区); 我想在我的C#程序中调用这个函数,并使用它来查看从中打印的数据。我读过关于非托管结构和从DLL导入函数的内容;但是,我无法在我的代码中理解如何执行此操作的语法。根据我对本主题的阅读,我生成了以下代码: [DllImport(“libteraview.dll”,CallingConvention=

我有以下在dll文件中实现的代码

typedef签名的uu int16 TS_元素;
类型定义TS_元素*TS_数据;
LIBTERAVIEW_API TS_RES tsRead(TS_数据缓冲区);
我想在我的C#程序中调用这个函数,并使用它来查看从中打印的数据。我读过关于非托管结构和从DLL导入函数的内容;但是,我无法在我的代码中理解如何执行此操作的语法。根据我对本主题的阅读,我生成了以下代码:

[DllImport(“libteraview.dll”,CallingConvention=CallingConvention.Cdecl)]
公共静态外部无效tsStart();
[DllImport(“libteraview.dll”,CallingConvention=CallingConvention.Cdecl)]
公共静态外部字节*tsRead(字节*buffer)`
第一个方法可以工作,但是,我无法让第二个方法运行和读取数据,因为它总是给我一个未处理的异常错误


对于如何从DLL导入此
tsRead()
函数,如果您能提供帮助,我将不胜感激。

请检查tsRead()函数的返回类型和参数类型。它应该是int而不是byte。

它很可能是其他内容,但很可能不是int。如果
buffer
应该指向一个
\uu int16
,则将其声明为
ref short buffer
。如果指向
\uuu int16
的数组,则将其声明为
[MarshalAs(LPArray),In,Out]short[]buffer
。如果需要手动指针算法,
IntPtr buffer
。关于返回值,这取决于
TS_RES
是什么。根据公司手册判断,它应该是int tsRead(short[]buffer)。其中,您传递的缓冲区必须足够大以存储相机图像,sizeX*sizeY。检查错误代码的返回值,0==“无错误”。如果仍有问题,请联系公司的技术支持。请注意,他们很可能已经有了一个.NET包装器,您肯定会更喜欢它。打电话给他们了解一下。非常感谢您的回复。我使用了以下行
公共静态外部inttsread([marshallas(UnmanagedType.LPArray),In,Out]short[]buffer)
。这非常有效,我现在能够调用该函数,并在创建具有正确大小的缓冲区后查看捕获的数据。我感谢你在这方面的帮助。