Неуправляемый в управляемый (.Net) - PullRequest
2 голосов
/ 19 марта 2011

Есть ли возможность конвертировать неуправляемую DLL в управляемую DLL?

Ответы [ 2 ]

7 голосов
/ 19 марта 2011

Обертки классов

Вы можете написать класс оболочки для DLL. Это довольно популярно. Сторонние поставщики библиотек обычно предоставляют такие оболочки .NET-сборок, которые обертывают их DLL API (написано на C ++, C и т. Д.)

В вашем классе оболочки просто DllImport все функции API в библиотеке DLL. Затем вы можете использовать эти функции, как и любой метод класса .NET.

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

Также рассмотрите возможность предоставления удобных перегруженных методов, поскольку CLR поддерживает их, а не все неуправляемые библиотеки.

COM Interop

Или, если эта неуправляемая DLL является COM-модулем, и вы просто хотите использовать ее как есть, и если вы используете Visual Studio, вы можете просто «добавить ссылку» на нее, и Visual Studio автоматически создаст класс-оболочку Interop для вас.

Импорт библиотеки типов

Если ваша неуправляемая DLL не является COM-модулем, но вы все равно хотите, чтобы она автоматически конвертировалась в CLR-совместимую сборку (без необходимости писать класс-оболочку), вы должны документировать все функции API в файле IDL. Обычно, если ваша библиотека представляет собой C ++ или C DLL, у них будут заголовочные файлы в исходном формате C ++ / C, которые можно легко преобразовать в файл IDL (который использует синтаксис C). Затем используйте midl, чтобы создать библиотеку типов для этой библиотеки DLL. Затем вы можете преобразовать эту библиотеку типов в сборку .NET с помощью tlbimp.

2 голосов
/ 19 марта 2011

Если у вас есть исходный код и это C ++, вы можете использовать C ++ / CLI .Если это Delphi, вы можете использовать Delphi Prism (без личного опыта).Это не просто «Открыть и перекомпилировать», но из того, что я слышал, это довольно просто, если вы не делаете сумасшедшие вещи (ну, а какой разработчик C ++ этого не делает?: -))

Если выу вас нет исходного кода, который вы не можете преобразовать, но вы все равно можете использовать его из управляемого кода через P / Invoke .

...