能否通过C#互操作服务找到任意dll文件中可用的函数列表并调用这些函数?
能否通过C#互操作服务找到任意dll文件中可用的函数列表并调用这些函数?
System.Reflection
中的类来查找和运行任意方法。LoadLibrary
和GetProcAddress
,并通过不安全指针调用所需的函数。您可以使用诸如dumpbin之类的工具分析任何本地模块(DLL或EXE)的导出函数。一旦您获得了导出函数的签名,您就可以为任何想要的函数编写P/Invoke包装器。
或者,您可以使用像P/Invoke Interop Assistant这样的工具自动完成繁重的工作。
但是,所有这些都依赖于本地模块在其导出表中列出您尝试调用的函数。如果您要连接的内容实际上没有被导出,那么您将不得不采用GetProcAddress等老式方法进行探索。
所以,如果你引用的 DLL 是一个具有 C 函数导出的本地 DLL,那么这将从容易到非常困难。
容易:如果你有 DLL 和 C 头文件,甚至最好有一些文档,这样你就知道导出函数期望什么参数、使用什么调用约定。没有问题,使用 .NET 互操作服务(PInvoke),如其他人所提到的,调用你需要的函数。
非常困难:如果你只有 DLL,你可以使用 DumpBin /exports filename.dll
来发现导出,但是然后你就必须反汇编代码来尝试确定调用约定以及函数期望的可能值和类型。老实说,如果这些东西对你来说像希腊语一样,那么这不是非常困难,而是边缘不可能,需要巨大但有趣的学习曲线。
我不知道关于“任意”的dll,但对于.NET程序集,有一个非常好用的工具叫做“Reflector”可以告诉你里面有哪些函数。然后你就可以使用反射来调用它们。我不熟悉“Interop服务”。