2011-12-26 18 views
0

我想使用反射来动态调用vb.net中的dll(不是一个程序集,非托管,可能是COM对象模型)。在vb.net中通过反射调用非装配(非托管)dll中的方法?

我见过几种不同的方法调用dll中的一个.net程序集 - 但我还没有找到动态调用像user32.dll或winmm.dll这样的dll内部方法的方法。我相信这会被称为迟到绑定?

我问的原因是我正在构建一种语言,这将取决于外部库的许多不同的功能。

一个例子(这个语言,我要建):

Declare Function mciSendStringA using "winmm.dll" (strCommand As String, strReturn As String, returnLength As Integer, blah As Integer) As Integer 

Declare Function WriteConsoleA using "kernel32.dll" (hConsoleOutput As Integer, lpBuffer As String, numberofcharstowrite as Integer, lpReserved as Integer) As Boolean 

当我建立在WINMM.DLL调用mciSendString解释,我怎么可以使用反射来处理呢?我希望用户能够引用他们希望的任何dll /方法。

我可以在正确的方向得到一些指导吗?也许甚至有些vb.net代码我可以分解和理解?

+0

避免尝试实现自己的PInvoke封送处理,细节会吃掉你。 TypeBuilder.DefinePInvokeMethod()是有帮助的。 – 2011-12-26 22:49:45

回答

0

您不要在非托管Win32本机库上使用反射。

相反,您加载它们并检索指向非托管函数的指针,以通过地址调用它们。这就是如何在C#中做到这一点:

http://blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_.aspx

+0

将模块句柄封装为'SafeHandle'类型(而不是'IntPtr')并使'ReleaseHandle'调用'FreeLibrary'会更好。 – bobbymcr 2011-12-26 22:06:49

+0

实际上,这篇文章显示了一个示例:http://msdn.microsoft.com/en-us/magazine/cc163716.aspx – bobbymcr 2011-12-26 22:09:53

+0

谢谢Wiktor。我已将该文章中提供的C#代码转换为vb.net,并且工作得很好。 – Dominick 2011-12-27 01:18:53