Оболочка C # вокруг неуправляемого C

#c# #c #wrapper

#c# #c #обертка #оболочка

Вопрос:

Я вижу, что здесь задавались похожие вопросы относительно переноса неуправляемого C на C #, но все они, похоже, касаются конкретных проблем реализации. Я хотел бы знать, каков общий подход при использовании C # и неуправляемого C .

Например, у меня есть довольно много классов, написанных на неуправляемом C , которые я хочу иметь возможность использовать через .NET (в идеале с VBA в Excel). До сих пор я использовал управляемый C / CLI для этого, однако заметил некоторые странности с языком, которых я бы предпочел избежать. При дальнейшем чтении кажется, что я мог бы обернуть свой неуправляемый C в C #, а затем иметь прямой доступ к .NET (при этом полностью избегая управляемого C / CLI). Возможно ли это, и если да, то каков наилучший способ добиться этого? Спасибо вам за помощь.

Комментарии:

1. COM — это вариант. В нем есть некоторые странности. Ну, несколько.

2. @HansPassant: Я поддерживаю это. Особенно, если целью является привязка к VBA / Excel.

Ответ №1:

У вас есть три варианта:

  • Используйте оболочку C / CLI. Идеальное решение, если вы ориентируетесь на .NET. Вы можете получить доступ ко всему из .СЕТЕВОЙ мир. Вы можете обернуть им свою библиотеку C , а затем использовать ее из C # / чего угодно.
  • Отказаться .Подключитесь к СЕТИ и создайте COM-оболочку, возможно, с помощью ATL. Это немного сложнее, но вы можете проще вызывать свой код из VBA / Excel. Вы по — прежнему сможете вызывать свои COM — классы из .СЕТЬ, если хочешь.
  • Скомпилируйте свой код как собственную DLL и используйте P / Invoke из C #. Обратите внимание, что это решение в лучшем случае утомительно, поскольку ничего не выполняется автоматически.

Если ваша цель действительно Excel / VBA, поскольку вы все равно собираетесь создавать COM-объекты, я бы выбрал вариант 2 и создал COM-классы напрямую, используя ATL. Хотя это полностью обходит .NET, но использует .ПЕРЕХОД от СЕТИ к интерфейсу между кодом C и Excel всегда был для меня проблемой.

Ответ №2:

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

Лично я бы подумал, что «лучшим» решением было бы продолжать использовать C / CLI для написания управляемых оболочек вокруг вашего собственного кода, которые предоставляют максимально простые общедоступные интерфейсы для уменьшения сложности.

Комментарии:

1. Pinvoke бессилен с классами C . Только функции в стиле C могут быть вызваны pinvoke.