Вопрос по vb.net, dll, c – Вызов управляемого кода из неуправляемого C

2

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

Мне нужно написать 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 или любыми другими упомянутыми методами, поэтому, если кто-то может помочь, это будет высоко ценится.

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

Ваш Ответ

3   ответа
8

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 является службой или оно размещено запущенным приложением, если оно просто экспортирует несколько функций, которые вы не можете сделать.

0

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

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

0

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

Похожие вопросы