Подключитесь к неизвестной функции в dll, используя C # - PullRequest
3 голосов
/ 25 мая 2010

Можно ли выяснить, какие функции доступны в произвольном dll-файле, а затем вызвать эти функции с помощью служб взаимодействия C #.

Ответы [ 7 ]

1 голос
/ 25 мая 2010

Вы можете анализировать экспортируемые функции любого собственного модуля (DLL или EXE) с помощью таких инструментов, как dumpbin . Получив подписи экспортируемых функций, вы можете написать обертки P / Invoke для любой из них.

В качестве альтернативы, вы можете использовать такой инструмент, как P / Invoke Interop Assistant , чтобы автоматически выполнять всю работу за вас.

Однако все это основано на том, что собственный модуль перечислил функции, которые вы пытаетесь вызвать, в его таблице экспорта. Если то, что вы хотите подключить, на самом деле не экспортируется, то вам придется прибегнуть к старомодному правописанию с GetProcAddress и т. Д.

1 голос
/ 25 мая 2010

Так что, если DLL, на которую вы ссылаетесь, является нативной DLL с экспортом из функции C, это будет диапазон от простого до очень сложного.

Легко: если у вас есть DLL и заголовочный файл C, а еще лучше с некоторой документацией, чтобы вы знали, какие аргументы ожидают экспортируемые функции, какое соглашение о вызовах используется. Нет проблем, используйте службы .NET Interop (PInvoke), как уже упоминали другие, и вызывайте нужные вам функции.

Очень сложно: если все, что у вас есть, это DLL, вы можете обнаружить экспорты, используя DumpBin /exports filename.dll, но тогда у вас останется дизассемблирование кода, чтобы попытаться определить соглашение о вызовах и какие возможные значения и типы ожидаются функцией. Если честно, если этот материал для вас греческий, то это не очень сложно, это невозможно без огромной, но интересной кривой обучения.

0 голосов
/ 25 мая 2010

Если это неуправляемый, родной dll, вам нужно будет использовать программу, такую ​​как dumpbin или PE Explorer. Обе программы покажут раздел экспорта dll.

0 голосов
/ 25 мая 2010

Если .dll является управляемой сборкой, то вы можете использовать классы в System.Reflection для поиска и запуска произвольных методов.

Если это родная Win32 dll, то у вас гораздо сложнее: вы должны P / Invoke API Win32 LoadLibrary и GetProcAddress и вызывать нужные функции через небезопасный указатель.

0 голосов
/ 25 мая 2010

Вы можете использовать Dependency Walker для поиска экспортируемых функций в DLL.

0 голосов
/ 25 мая 2010
0 голосов
/ 25 мая 2010

Я не знаю о "произвольных" dll, но для сборок .net есть отличная утилита под названием "Reflector", которая скажет вам, какие функции находятся внутри. Вы можете позвонить им с отражением. Я не знаком с "службами взаимодействия".

...