Существуют различные типы библиотек DLL, вам нужно будет обрабатывать их по-разному, когда вы используете их в проекте C#. 3 основных типа:
- DLL, которые содержат неуправляемый код и были предназначены для использования программой, написанной в неуправляемом коде. Вы не можете использовать такую DLL напрямую, нет способа добавить ссылку на них в проекте C#. Вы должны использовать P/Invoke, для объявления экспортированных функций в DLL требуется атрибут [DllImport]. Glut32.dll - такая DLL. Самый простой тест, который вы можете использовать, чтобы узнать, есть ли у вас такая DLL, - запустить Dumpbin.exe/exports в этой DLL. В нем перечислены имена экспортируемых функций.
- DLL, реализующие COM-сервер в процессе. Они также написаны в неуправляемом коде. .NET имеет очень хорошую поддержку для использования таких серверов, если у вас есть библиотека типов для них. Библиотека типов обычно внедряется в DLL, Visual Studio ожидает ее найти, когда вы добавляете ссылку на проект, либо через вкладку COM, либо на вкладке «Обзор». Очень простой тест Dumpbin.exe/export снова, COM-сервер в процессе имеет 4 экспортированные функции. Функция DllGetClassObject является важной. Вы можете просмотреть библиотеку типов, встроенную в DLL, с помощью OleView.exe, File + View Typelibrary. Хорошим примером является c: \ windows \ system32 \ shell32.dll
- DLL, которые были созданы управляемым компилятором. Они не содержат машинный код, как и другие типы, они содержат IL-код и метаданные. Это родной тип DLL для управляемого кода, вы просто используете Project + Add Reference для добавления ссылки, компилятор автоматически знает типы, доступные в DLL.
Первый вид - это тот, с которым вы столкнетесь много для DLL в дикой природе. Там есть лот кода, написанного для Windows на неуправляемом языке. Это не что-то вроде DLL, которое особенно легко использовать из управляемого кода. Например, у Glut32.dll есть лот экспортируемых функций, написание декларации P/Invoke для каждого из них является болезненным.
Инструменты, которые вы можете использовать для этого: SWIG и PInvoke Interop Assistant. Первый требуется, когда DLL была написана на языке C++. C++-классы не могут использоваться непосредственно из программы C#, им нужна оболочка, написанная на языке C++/CLI. Последний инструмент полезен для библиотек DLL, написанных на C, включая Windows API.
Остерегайтесь того, что эти инструменты обычно не дают вам чистого и гарантированного труда взаимодействия. Объявления в неуправляемом коде неоднозначны, вам нужно знать точную семантику аргументов неуправляемой функции, чтобы выбрать правильный. Получение неправильного может быть трудно диагностировать, лучшим местом для получения помощи является форум или сайт Q + A. Подобно stackoverflow.com
+1; Лучший ответ до сих пор, другой сайт стоит упомянуть http://pinvoke.net/ - который, как представляется, имеет раздел для glut32.dll, к сожалению он в настоящее время пуст, хотя :( – Rob