我们如何在 C# 中从 C++ DLL 中获取所有方法?
Posted
技术标签:
【中文标题】我们如何在 C# 中从 C++ DLL 中获取所有方法?【英文标题】:How do we get all methods from C++ DLL in C#? 【发布时间】:2019-12-17 18:30:18 【问题描述】:我有一个 C++ DLL,我需要在我的 C# 应用程序中获取它的方法,但我无法获取这些方法。
这是我的代码:我尝试将 C++ Dll 转换为字节数组并获取它的方法。
byte[] data = File.ReadAllBytes(@"C:\test.dll");
var result = data.GetType();
foreach (Type type in result.Assembly.GetTypes())
if (!type.IsPublic)
continue;
MemberInfo[] members = type.GetMethods();
foreach (MemberInfo member in members)
Console.WriteLine(member.Name);
【问题讨论】:
C++ DLL 不是 .NET 程序集,因此这样的反射不起作用。data.GetType()
是 typeof(byte[])
,所以 result.Assembly
是代表 CLR 本身的实例 (mscorlib.dll
) 您可以整天使用反射,但您只会获得 .NET 内置函数, 与 ODSSwitchFunctions.dll 无关
@RemyLebeau 谢谢。但我怎么能确定它的方法呢?你的解决方案是什么?
@Sam 看到我刚刚发布的答案
【参考方案1】:
我认为这是不可能的。我认为普通的 dll 甚至不包含类型元数据。
但也许我错了。或者这可能会有所帮助:Import TLB into C#
【讨论】:
有一种方法可以枚举所有导出的函数。检查这个:***.com/questions/437432/… @EylM 获取函数名称很容易。获取有关函数的更详细信息需要对函数进行逆向工程【参考方案2】:C++ DLL 不是 .NET 程序集,因此您正在寻找的反射类型根本不起作用。
除非 DLL 中包含嵌入式 COM 类型库,否则您唯一可以 100% 确定地获得的是 DLL 导出函数的名称/序号,因为该信息可在 DLL 的 EXPORTS 表中免费获得。但是要获得有关函数的更多详细信息(返回值、调用约定、参数列表),您必须对 DLL 的原始机器代码进行逆向工程,这并非易事。该信息根本不存储在 DLL 本身的任何地方,只有创建 DLL 的编译器知道这些细节。像 IDA 这样的逆向工程工具可以让任务变得更容易一些,但仍然需要大量的手动工作来解释和调整结果。
【讨论】:
以上是关于我们如何在 C# 中从 C++ DLL 中获取所有方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何在基于 Visual-C++ 的 .net DLL 中从 C# 接收字符串?
在同一解决方案中从 c# 项目到 c++ 项目的 DllImport