2011-12-26 16 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