如何使用C#中的反射从用C+编写的非托管程序集中收集信息+/VB?

如何使用C#中的反射从用C+编写的非托管程序集中收集信息+/VB?,c#,.net,reflection,.net-assembly,unmanaged,C#,.net,Reflection,.net Assembly,Unmanaged,我有一个我正在处理的项目,我在其中解析一个.vbp文件,该文件包含程序集及其GUID(以及其他内容)的路径列表。解析文件的目标是使用每个程序集的完整路径来加载它们,然后使用反射来获取关于每个程序集的信息,例如其接口以及它们定义的方法和属性 到目前为止,我的代码在托管程序集(例如用C#编写的.exe)上运行良好,但是所有正在加载的程序集都是非托管C++/VB程序集。当我试着打电话时: var assemblyPath = @"C:\*path to unmanaged .dll*"; var as

我有一个我正在处理的项目,我在其中解析一个.vbp文件,该文件包含程序集及其GUID(以及其他内容)的路径列表。解析文件的目标是使用每个程序集的完整路径来加载它们,然后使用反射来获取关于每个程序集的信息,例如其接口以及它们定义的方法和属性

到目前为止,我的代码在托管程序集(例如用C#编写的.exe)上运行良好,但是所有正在加载的程序集都是非托管C++/VB程序集。当我试着打电话时:

var assemblyPath = @"C:\*path to unmanaged .dll*";
var assemblyObj = Assembly.LoadFrom(assemblyPath);
在非托管程序集上,我得到一个BadImageFormat异常,这是预期的,因为它不是托管程序集。我已经到处寻找了如何实现这一点,但到目前为止,我发现的大多数信息都是关于如何实际使用非托管程序集中定义的内容。在这些情况下,解决方案需要知道用户试图从非托管程序集中获取的函数名称等信息,以便在其托管应用程序中使用。关于这些程序集,我只知道它们的路径、名称以及它们是非托管的C++/VB。我不需要从这些程序集中调用任何函数或使用任何东西,我只需要获取它们的信息,例如它们定义的接口的名称以及这些接口中方法的签名

我发现有两页看起来很有希望:


虽然我已经看完了这些,但我不能说自己精通反思,甚至.NET,因此,我不确定我应该做什么/如何实现我正在尝试做的事情。

很抱歉,反射只在托管代码上起作用……有一个名为DUMPBIN的旧工具,可以让您在未更改的可执行文件中进行大量潜伏,但它不是编程接口。它可能会利用一些现有的接口,一旦您确定某个给定的exe未被管理,您就可以尝试使用这些接口。@PranayRana我知道反射只对托管代码有效,但是有没有办法在非托管代码周围应用某种包装器,使其“出现”被管理?我想一种说法是,如果在托管代码中重新声明函数签名,那么平台调用允许托管代码访问非托管程序集中的函数,而我要寻找的是一种方法,即在给定程序集名称的情况下,仅获取表示非托管代码中签名的字符串(所以我甚至不需要P/Invoke允许的功能,只需要提供给它的功能)这个信息只有在一个符号名中才有。签名者可以知道签名。现在如果它是C++,符号名可能被加密以包括签名,但是超出它的任何东西是不可能的。选项是以类似于IDA Pro或其他类似工具的方式反汇编函数,但即使这样也不完美,绝对不是微不足道的。很抱歉,反射只在托管代码上工作……有一个名为DUMPBIN的旧工具,可以让您在未更改的可执行文件中进行大量的隐藏,但它不是编程的接口。它可能会利用一些现有接口,一旦确定某个给定的exe未被管理,您就可以尝试使用这些接口。@PranayRana我知道反射只对托管代码有效,但是有没有办法在非托管代码周围应用某种包装器使其“出现”被管理?我想一种说法是,如果在托管代码中重新声明函数签名,那么平台调用允许托管代码访问非托管程序集中的函数,而我要寻找的是一种方法,即在给定程序集名称的情况下,仅获取表示非托管代码中签名的字符串(所以我甚至不需要P/Invoke允许的功能,只需要提供给它的功能)这个信息只有在一个符号名中才有。签名者可以知道签名。现在如果它是C++,符号名可能被加密以包括签名,但是超出它的任何东西是不可能的。我们的目标是以类似于IDA Pro或其他类似工具的方式分解函数,但即使这样也不完美,绝对不是微不足道的。