我们如何在 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 中获取所有方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中从 C++ .DLL 加载值始终返回 true

在 C# 中从 C++ DLL 访问指针参数值

如何在基于 Visual-C++ 的 .net DLL 中从 C# 接收字符串?

在同一解决方案中从 c# 项目到 c++ 项目的 DllImport

C# 调用需要双精度数组和结构作为输入的 C++ DLL 函数

cv::VideoCapture 在 C# 项目中从 DLL 使用时不会打开文件或流