Каковы плюсы и минусы создания .NET-оболочки неуправляемой DLL? - PullRequest
0 голосов
/ 28 ноября 2010

Это пустая трата времени или есть очевидное и измеримое преимущество создания оболочки .NET для неуправляемой DLL?

Дополнительная информация:

  • Я не контролирую библиотеку DLL, однако могу принять решение не заменять ее самой новой версией.
  • В DLL много классов. И много вспомогательных перечислений.
  • DLL предоставляет проекту критические функции.

Ответы [ 6 ]

3 голосов
/ 28 ноября 2010

В DLL много классов

Это странный вопрос, но важные детали отсутствуют.Если вы хотите использовать эти классы из управляемого кода, тогда у вас нет выбора , кроме как написать для них оболочку C ++ / CLI.Только компилятор C ++ может правильно построить их.P / Вызов конструктора технически невозможен, хотя довольно сложно найти его имя экспортируемой функции, вы не можете угадать, сколько памяти выделить для объекта.Только компилятор C ++ знает.

Написание оболочек не очень сложно, оно в значительной степени механическое.Подробнее об этом вы найдете по ссылкам в этом ответе .

2 голосов
/ 28 ноября 2010

Плюсы:

  1. Намного проще использовать функциональные возможности DLL в проектах .NET
  2. Вы можете написать свой собственный загрузчик неуправляемой DLL, так что вы не сможетене нужно полагаться на алгоритм в LoadLibrary.
  3. Вы можете добавить изоляцию позже, чтобы неуправляемая DLL осталась вне процесса

Минусы:

  1. Это много работы

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

Кроме того, я знаю, что вы сказали, что не можете управлять DLL, но если бы вы могли, оболочка C ++ / CLI .lib - это намного более хороший способ использования неуправляемого кода в .NET (в основном, это для других, которые видят этот вопрос, или если вы можете получить доступ).

1 голос
/ 28 ноября 2010

Плюсы:

1) Какая-то защита ваших алгоритмов, если они находятся в неуправляемой dll;

2) Предотвращение узких мест в GC.Полный контроль над памятью;

Минусы:

1) Вы должны поддерживать как 32-битные, так и 64-битные сборки неуправляемой DLL, если вы хотите использовать 64-битную среду .Net;

2) Необходимо создать очень маленький интерфейс (мост) между управляемым и неуправляемым кодом для предотвращения снижения скорости.Иногда это невозможно;

1 голос
/ 28 ноября 2010

Вы можете обернуть управление ресурсами, используемыми сторонним кодом, в код, который реализует IDisposable, что позволит использовать сборку мусора .NET для освобождения ресурсов (файловых дескрипторов и т. Д.), Которые вы больше не используете..

Другие преимущества - стандартные для почти всех сторонних кодов:

Вы изолируете большую часть своего кода от любых изменений, которые могут произойти в сторонних dll в будущем.Если что-то меняется, вам просто нужно изменить реализацию в вашем классе-обертке.Остальная часть вашего кода остается неизменной.

Вы также можете встроить кэширование, проверку и проверку ошибок в класс-оболочку, если какой-либо из них отсутствует в неуправляемом коде.

1 голос
/ 28 ноября 2010

Несколько преимуществ, которые я знаю:

  1. Вы можете поместить xmldoc в управляемую оболочку и, следовательно, иметь документацию, доступную для всех разработчиков в IDE.
  2. Вы можете абстрагироваться от всех IntPtr с, что может стать источником проблем и ошибок для менее опытных разработчиков.
  3. Вы можете создавать высокоуровневые операции для общих сценариев из низкоуровневых строительных блоков в неуправляемой DLL, уменьшая вероятность ошибок. (Конечно, это не относится к обертке неуправляемых DLL-библиотек).
0 голосов
/ 28 ноября 2010

Если вы хотите использовать эту DLL в проекте C # или VB.NET (или любом другом языке .net, кроме C ++ / CLI), я не вижу разумной альтернативы (при условии, что вы не собираетесь воссоздавать управляемую версию DLL полностью с нуля). Конечно, вы могли бы использовать вместо этого COM, но в большинстве случаев это будет сложнее и намного больше работы с гораздо худшим результатом с точки зрения клиентского проекта .NET.

РЕДАКТИРОВАТЬ: хорошо, согласно вашим комментариям DLL уже COM Dll. Тогда вам, конечно, больше не понадобится оболочка .NET. Мой ответ был нацелен на случай, если у вас есть простая старая библиотека C ++ DLL, где использование COM означает «добавление оболочки COM» к ней.

...