Вызов методов в несборочных (неуправляемых) DLL через отражение в vb.net?

Я хочу использовать отражение для динамического вызова dll (не сборки, неуправляемой, возможно, объектной модели COM) в vb.net.

Я видел несколько различных методов вызова метода в dll, которая представляет собой сборку .net, но я не нашел способа динамически вызывать метод внутри dll, такой как user32.dll или winmm.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

Когда я создаю интерпретатор для вызова mciSendString в winmm.dll, как я могу использовать отражение, чтобы справиться с этим? Я хочу, чтобы пользователь мог ссылаться на любую DLL / метод по своему желанию.

Могу ли я получить рекомендации в правильном направлении? Возможно, даже какой-нибудь код vb.net, который я смогу разобрать и понять?


person Dominick    schedule 26.12.2011    source источник
comment
Не пытайтесь реализовать свой собственный маршаллер pinvoke, детали вас съедят. TypeBuilder.DefinePInvokeMethod () играет важную роль.   -  person Hans Passant    schedule 27.12.2011


Ответы (1)


Вы не используете отражение в неуправляемых собственных библиотеках Win32.

Вместо этого вы загружаете их и извлекаете указатели на неуправляемые функции, чтобы вызывать их по адресу. Вот как это сделать на C #:

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

person Wiktor Zychla    schedule 26.12.2011
comment
Было бы лучше обернуть дескриптор модуля как тип SafeHandle (вместо IntPtr) и иметь ReleaseHandle вызов FreeLibrary. - person bobbymcr; 27.12.2011
comment
Фактически, в этой статье показан пример: msdn.microsoft.com/en-us /magazine/cc163716.aspx - person bobbymcr; 27.12.2011
comment
Спасибо, Виктор. Я преобразовал код C #, представленный в этой статье, в vb.net, и он работает очень хорошо. - person Dominick; 27.12.2011