#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.