用固定值绕过 C# 中的 DLL 调用?
Posted
技术标签:
【中文标题】用固定值绕过 C# 中的 DLL 调用?【英文标题】:Bypass a DLL call in C# with fixed value? 【发布时间】:2022-01-11 08:25:04 【问题描述】:我有一个 DllImport,它需要一个带有两个字节引用的整数。我没有 DLL 的源代码,并且 DLL 响应的值不正确。
[DllImport("asd.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int state(ref byte ktime, ref byte is_h);
根据我有限的编程知识,这个调用将传递一个包含 15 字节数据的数组,正如需要所述数据的代码所建议的那样?
byte[] array2 = new byte[14];
byte[] array3 = new byte[1];
int num = state(ref array2[0], ref array3[0]);
该数据是一个时间戳 (YYYYMMDDHHMMSS) 和一个 15 字节数组中从 0 到 7 的单个数字。 所以我应该看到像 202112060141307 这样的东西。
我需要做的,不是让软件访问这个 DLL,而是让它只传递我选择的 15 字节数组。 我没有检查代码并对其进行编辑的原因是这被调用了 100 次,我们有多个版本的代码要测试,所以我们有多少版本的 100 倍。
假设我正朝着正确的方向前进,但我完全迷路了。这样做的正确方法是什么?
【问题讨论】:
我不确定我是否理解问题或问题是什么 所以你有一个来自 dll 的导出,它需要 2 个字节数组,你想传递一个数组? 你有100个版本的你正在测试的代码有什么实际的原因吗?如果没有,那么您应该了解源代码控制。 【参考方案1】:您只需要一个小调解员...保持相同的签名...这样您的 100 个使用“状态”调用的地方就不需要编辑...然后您可以选择是否调用真正的底层 DLL 函数,或者只是设置您的“测试”数据。
这仅在您的代码中有一处(或仅有几处)执行函数的DLLImport
并且可以更改时才有效。
这意味着只需更改 DLLImport
的签名。
[DllImport("asd.dll", EntryPoint = "state", CallingConvention = CallingConvention.Cdecl)]
public static extern int asd_state(ref byte ktime, ref byte is_h);
public static int state(ref byte ktime, ref byte is_h)
// some flag to control which is called or you could
// use an #if definition
if (callunderlyingdll)
return asd_state(ref ktime, ref is_h);
else
ktime = ..your array here..
is_h = ..your value here...
return 0;
另一种方法是使用挂钩来挂钩“C#”“状态”函数,将其指向您的代码以设置返回的状态值......您需要一个挂钩库来执行此操作例如
https://github.com/pardeike/Harmony
【讨论】:
以上是关于用固定值绕过 C# 中的 DLL 调用?的主要内容,如果未能解决你的问题,请参考以下文章
用C++封装了Halcon的算法,返回值为Hobject类型,在C#中调用dll怎么用Hobject类型的返回值。
C# DateTimePicker 显示值总是变化,如何设置使其固定?