如何解决使用 dll ref/out 函数作为输入的通用委托已解决并记录下来
我得到了什么
所以基本上我已经找到了一个 dll 包装函数的通用解决方案,以轻松实现日志记录/错误处理。我所有的 dll 函数都返回一个 bool
。 dll 在 C++ 中
在查看 this 和 that 仅举几例后,我明白了,我基本上不关心我的 dll 函数传递的参数,所有调用基本上都是这样工作的:
ExecuteCommand(() => DllInterface.DllFunction([someParams]));
与
private static void ExecuteCommand(Func<bool> aCommand,string logmessage = null,bool DoThrow = true)
{
if (!aCommand())
{
if (DoThrow)
{
throw new Exception(DllInterface.LastError());
}
else
{
Log.Error(aCommand.Method.Name);
}
}
else
{
Log.Information(aCommand.Method.Name);
}
}
这样我就可以调用任何函数,而不管它的签名如何。
问题是,我有时也想从 dll 接收信息,因此使用 ref 或 out。
由于 Func<bool>
不喜欢 ref 我试图做这样的事情:
public delegate V RefFunc<in T,U,out V>(T input,out U refType);
根据链接一。只要 T
和 V
是不错的类型,这就可以正常工作,但我找不到解决方案,如果 T
是 Func<bool>
,则编写 lambda。测试用法就是这样实现的;
RefFunc<double,int,bool> refFunc = (double adouble,out int testint) =>
{
testint = (int)Math.Truncate(adouble);
return true;
};
Reffunc(adouble,out int aInt);
我想要的(并且已经得到)
基本上是 Execute 命令的重载,它接受
ExecuteCommand(() = > DllInterface.DllFunctions(ref int rval));
并实际执行
...if(!acCommand(ref rval) ...
这可能吗?
回答
答案已经存在,事实证明我可以将任何函数传递给当前的 ExecuteCommand()
,因为作为命令传递的签名是由 Lambda 定义的,而不是 Lambda 正在调用的函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。