我有一堆外部C函数,在C#中变成这样的东西:
public extern static int clGetDeviceInfo(
IntPtr device,
uint param_name,
IntPtr param_value_size,
void* param_value,
out IntPtr param_value_size_ret);
因为有一堆看似相似的函数,我想创建一个读取这些C函数提供的数据的方法。这就是我的用途:
unsafe public static ErrorCode GetInfoString(
IntPtr handle, uint property,
Func<IntPtr, uint, IntPtr, void*, IntPtr, int> infoFunc,
out string value)
{
// reading logic
}
我的问题是C#不允许我使用void*
作为Func
的通用参数。有没有解决这个问题的方法?
我既不能改变外部C函数的签名,也不能改变C#函数的签名(我使用库)。
答案 0 :(得分:5)
我的问题是C#不允许我使用
hidden_action := hidden_action ||’&userid=’ ||get_application_property(username)||’/’|| get_application_property(password)||’@’|| get_application_property(connect_string);
作为Func的泛型参数。有没有解决这个问题的方法?
是。使用void*
使用您目前所在的IntPtr
。如果可以避免,请不要在C#中使用void*
。
我无法更改我试图作为参数传递的函数的签名,因此无法正常工作。
确实如此。
void*
您无法更改它,因为它位于库中。精细。 可以你改变什么?您可以更改自己的代码。所以编写自己的代码!你是一个计算机程序员;那就是你做的:
public extern static int clGetDeviceInfo(
IntPtr device,
uint param_name,
IntPtr param_value_size,
void* param_value,
out IntPtr param_value_size_ret);
在那里,现在你有一个方法有一个签名,你可以用private static int MyClGetDeviceInfo(
IntPtr device,
uint param_name,
IntPtr param_value_size,
IntPtr param_value,
out IntPtr param_value_size_ret)
{
unsafe
{
return clGetDeviceInfo(device, param_name, param_value_size,
(void*)param_value, out param_value_size_ret);
}
}
。
答案 1 :(得分:0)
正如@MarcinJuraszek指出:
您可以定义自定义委托类型,而不是重用
Func
是的,我可以。使用代表为我工作。
unsafe public delegate int GetInfoMethod(
IntPtr handle, uint param_name, IntPtr param_value_size,
void* param_value, out IntPtr param_value_size_ret);
unsafe public static ErrorCode GetInfoString(
IntPtr handle, uint property,
GetInfoMethod infoFunc,
out string value)
{
// reading logic
}