[英]DllImport Event Arguments Marshalling for Function in C#
我对使用 DllImport 和编组真的很陌生。 我已经阅读了 Microsoft 的文档,并通过反复试验获得了我需要的大部分内容,但在使用大 function 时遇到了困难。我什至不确定从哪里开始。
这是 C header:
extern EXPORT int kt10_library_init(void);
extern EXPORT int kt10_list_usb_devices(kt10_conn_string_t *list, int max_devices, int *dev_count);
extern EXPORT int kt10_connect(kt10_conn_string_t conn_string, int *id_conn, int timeout,
int (*event_connected)(int,char *,void *),
int (*event_connection_error)(int, char *,void *),
int (*event_disconnected)(int,char *,void *),
int (*event_live_data)(int,char *,int,int,float,float,void *),
void *user_data);
这是我目前在 C# 中有效的代码
[DllImport("libkt10int.dll")] private static extern int kt10_library_init();
[DllImport("libkt10int.dll")] private static extern int kt10_list_usb_devices([In,Out] char[] list, int max_devices, ref UInt32 dev_count);
[DllImport("libkt10int.dll")] private static extern int kt10_connect(char[] conn_string, ref UInt32 id_conn, int timeout,...
但我对k10_connect function 中的(事件)内容感到困惑。有人有某种文档可以指导我或指导我如何编写吗? 我什至不确定我应该寻找什么。 除了 header 之外,我没有太多关于 go 的信息。
这是我正在阅读的一些文档https://learn.microsoft.com/en-us/do.net/api/system.runtime.interopservices.dllimportattribute?view.net-6.0
更新 1好的,根据我正在为那些 arguments 创建代表的评论,这给了我一个起点,但我遇到了 memory 访问冲突。 不幸的是,我无权访问任何文档。 该库不打算开源。
[DllImport("libkt10int.dll")] private static extern int kt10_connect(
char[] conn_string,
ref UInt32 id_conn,
int timeout,
ref event_connected onConnected,
ref event_connection_error onConnectionError,
ref event_disconnected onDisconnected,
ref event_live_data onLiveData,
ref unknown onUserData);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int event_connected(int id,ref char conChar,ref unknown fun);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int event_connection_error(int id,ref char conChar,ref unknown fun);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int event_disconnected(int id,ref char conChar,ref unknown fun);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int event_live_data(int id, ref char conChar, int num1, int num2, float num3, float num4, ref unknown fun);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void unknown();
public static void Connect(string device)
{
UInt32 connId = 0;
var Unknown = new unknown(OnUnknown);
var connectedEvent = new event_connected(Event);
var connectionErrorEvent = new event_connection_error(Event);
var disconnectedEvent = new event_disconnected(Event);
var liveDataEvent = new event_live_data(EventLiveData);
kt10_connect(device.ToCharArray(), ref connId, 1000, ref connectedEvent, ref connectionErrorEvent, ref disconnectedEvent, ref liveDataEvent, ref Unknown);
Debug.WriteLine("Attempting connection");
}
感谢评论中的每个人对代表的帮助。 这正是我让 function 工作所需要的。 我能够取回连接 ID 并使用它来获取设备的序列号!
我可能还有更多工作要做,但这主要是让程序运行所需的。
private const int KT10V2_MAX_CONNECTION_STR_LEN = 128;
//private char[]
[DllImport("libkt10int.dll")] private static extern int kt10_library_init();
[DllImport("libkt10int.dll")] private static extern int kt10_list_usb_devices([In,Out] char[] list, int max_devices, ref UInt32 dev_count);
[DllImport("libkt10int.dll")] private static extern int kt10_get_serial(uint connectionID, [In, Out] char[] serialNumber);
[DllImport("libkt10int.dll")] private static extern int kt10_connect(
char[] conn_string,
ref UInt32 id_conn,
int timeout,
event_connected onConnected,
event_connection_error onConnectionError,
event_disconnected onDisconnected,
event_live_data onLiveData,
unknown onUserData);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int event_connected(int id,ref char conChar, unknown fun);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int event_connection_error(int id,ref char conChar, unknown fun);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int event_disconnected(int id,ref char conChar, unknown fun);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int event_live_data(int id, ref char conChar, int num1, int num2, float num3, float num4, unknown fun);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void unknown();
static readonly unknown Unknown = new(OnUnknown);
static readonly event_connected connectedEvent = new(Event);
static readonly event_connection_error connectionErrorEvent = new(Event);
static readonly event_disconnected disconnectedEvent = new(Event);
static readonly event_live_data liveDataEvent = new(EventLiveData);
public static uint Connect(string device)
{
UInt32 connId = 0;
kt10_connect(device.ToCharArray(), ref connId, 1000, connectedEvent, connectionErrorEvent, disconnectedEvent, liveDataEvent, Unknown);
return connId;
}
public static string GetSerial(uint connectionID)
{
var serialNumber = new char[KT10V2_MAX_CONNECTION_STR_LEN];
kt10_get_serial(connectionID, serialNumber);
return new string(serialNumber);
}
public static void InitKTLibrary()
{
kt10_library_init();
}
public static string[] ListUSBDevices(int maxDevices = 99)
{
UInt32 devCount = 0;
var list = new char[KT10V2_MAX_CONNECTION_STR_LEN];
kt10_list_usb_devices(list, maxDevices, ref devCount);
var resultString = new string(list);
resultString = resultString.Trim();
if (devCount == 0)
return Array.Empty<string>();
return resultString.Split(Environment.NewLine);
}
private static void OnUnknown()
{
}
private static int Event(int id, ref char conChar, unknown fun)
{
return -1;
}
private static int EventLiveData(int id, ref char conChar, int num1, int num2, float num3, float num4, unknown fun)
{
return -1;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.