Вызов управляемого кода из неуправляемого C

Таким образом, примерно через полтора дня после этого я достиг нулевого прогресса.

Мне нужно написать DLL на C, который использует плагин для существующего приложения. DLL должна быть скомпилирована компилятором Visual Studio 2008 со следующими параметрами

cl -DNT40 -DPOMDLL -DCRTAPI1=_cdecl -DCRTAPI2=cdecl -D_WIN32 -DWIN32 -DWIN32_LEA N_AND_MEAN -DWNT -DBYPASS_FLEX -D_INTEL=1 -DIPLIB=none -I. -I"C:\plm\2T-RAC\TcEx press53\include" -I"C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include" -c -nologo -EHsc -W1 -Ox -Oy- -MD C:\mydir\myDll.c

Затем он связан с библиотекой приложений.

Что ему действительно нужно сделать, и что вызывает у меня проблемы, так это то, что в рамках одного из методов ему нужно получать данные с сервера SQL Server 2008 r2.

Из того, что я видел сегодня, вы не сможете сделать это непосредственно в C, поскольку SQL Server прошлого 2005 года был разработан для взаимодействия с языками CLR (C #, C ++, VB.Net).

Было предложено, чтобы я обработал всю связь с базой данных с помощью библиотеки DLL VB.Net, а затем вызвал указанную функцию из библиотеки DLL.

Большая часть того, что я нашел в теме вызова управляемых dll-файлов из неуправляемого кода, говорила о pinvoke или com-обёртках, и в основном с точки зрения c ++.

У меня нулевой опыт работы с COM или любыми другими упомянутыми методами, поэтому, если кто-то может помочь, это будет высоко ценится.

 Joe30 мая 2012 г., 19:22
Вы могли бы создатьnative C++ DLL затемextern "C" функции, которые вы хотели бы выставить на ваш C-код.
 Adriano Repetti01 июн. 2012 г., 09:37
Что вы должны делать в SQL? Запрос? SQL Server имеетNOT сделано для общения только с .NET языками !!! Вы можете выполнить запрос или выполнить команды SQL на любом языке, который только можете себе представить (посмотрите на ADO, ODBC, OLEDB и т. Д.).
 Rohit18 окт. 2013 г., 06:39
возможный дубликатExporting dll functions to unmanaged programs

Ответы на вопрос(3)

Mixed mode assembly

Первый и более простой способexport Управляемый код для клиента C - это написание вашего кода с использованием C ++ / CLI (или написание оболочки на этом языке). Вы просто экспортируете нужные вам функции C, как в обычном неуправляемом коде, и внутри их реализации вы вызываете нужные вам управляемые функции. Здесь наMSDN.

COM Interop

Вы экспортируете свои управляемые классы как объекты COM. Из неуправляемого кода вы увидите обычные COM-объекты, посмотритеВот.

Reverse P/Invoke

Вы можете сделать это по-разному. Более простой способ состоит в том, чтобы изменить точку зрения. Если у вас есть сборка VB.NET (vbnet.dll) и библиотека C (purec.dll) первое, что вы можете себе представить, это добавитьdependency вvbnet.dll вpurec.dll, Если вы делаете это таким образом, вы должны использовать COM или сделать ваше приложение хостом .NET. Более простой способ - вернуться: добавить зависимостьpurec.dll вvbnet.dll (используя P / Invoke). Ваш интерфейс C будет экспортироватьstruct (например), которые могут быть заполнены указателями на функции,struct в VB.NET (как делегаты) и ваш код C будет просто вызывать их. ВзглянутьВот.

Other options

Native hostЭто трудный путь. Ваше нативное приложение будет содержать приложение .NET. Это долго и сложно, я думаю, это слишком много, если вам нужно только экспортировать несколько функций. Я публикую здесь только для справки:Обзор хостинга на MSDN.
IPC, Вы можете держать свое приложение отделенным, и друг друга могут игнорировать, как написано другое. Просто определите интерфейс и канал для их соединения (именованные каналы, общая память или что-то еще, посмотритеВот для списка). Это работает, если ваше приложение VB.NET является службой или оно размещено запущенным приложением, если оно просто экспортирует несколько функций, которые вы не можете сделать.

который вы используете повсеместно, я, вероятно, рекомендую не использовать его в приложении на языке Си.

Существуют различные способы связи с MSSQL из C. Либо с помощью собственного драйвера, либо с помощью ODBC и т. Д.

Решение Вопроса

которым я решил это, состоял в том, чтобы просто вызвать Cdll-вызов cmd и выполнить компилируемый исполняемый файл VB.NET и направить его вывод. Хотя это не было полностью идеальным решением, оно работало в этой ситуации, когда все, что мне требовалось, было единственной строкой.

Ваш ответ на вопрос