从非托管C调用托管代码

时间:2012-05-30 17:18:05

标签: c vb.net dll sql-server-2008-r2

所以经过大约一天半的时间我没有取得任何进展。

我需要在C中编写一个DLL,用于现有应用程序的插件。 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中执行此操作,因为2005年以后的SQL Server旨在与CLR语言(C#,C ++,VB.Net)进行通信。

有人建议我使用VB.Net dll处理所有数据库通信,然后从C dll中调用所述函数。

我在非托管代码中调用托管dll主题的大部分内容都是关于pinvoke或com包装器的,主要是从c ++的角度来看。

我对COM或任何提及的技术没有经验,所以如果有人可以提供帮助,我将不胜感激。

3 个答案:

答案 0 :(得分:9)

你有很多选择可以做到这一点,但并非所有这些都是微不足道的。

混合模式程序集

导出托管代码到C客户端的第一种也是更简单的方法是使用C ++ / CLI编写代码(或使用该语言编写包装器)。您只需像在普通的非托管代码中那样导出所需的C函数,并在其实现中调用所需的托管函数。这里是MSDN

COM Interop

将托管类导出为COM对象。从非托管代码中,您将看到正常的COM对象,请查看here

反向P /调用

你可以用不同的方式做到这一点。更简单的是恢复观点。如果你有一个VB.NET程序集(vbnet.dll)和一个C库(purec.dll),你可能想到的第一件事就是将依赖添加到vbnet.dllpurec.dll。如果以这种方式执行此操作,则必须使用COM或使应用程序成为.NET主机。一种更简单的方法是恢复:在purec.dll中向vbnet.dll添加依赖项(使用P / Invoke)。你的C接口将导出一个struct(例如),可以用函数指针填充,你将在VB.NET中填充struct(作为代理),你的C代码将简单地调用它们。看看here

其他选项

原生主机:这是很难的方法。您的本机应用程序将托管.NET应用程序。这是漫长而复杂的,如果您只需要输出少量功能,我想这太过分了。我在这里发帖仅供参考:hosting overview on MSDN IPC 即可。您可以将应用程序分开,彼此可以忽略另一个应用程序的编写方式。只需定义一个接口和一个通道来连接它们(命名管道,共享内存或其他任何东西,查看here列表)。如果您的VB.NET应用程序是一个服务,或者它由正在运行的应用程序托管,如果它只是导出一些您无法执行的功能,那么这是有效的。

答案 1 :(得分:1)

我解决这个问题的方法就是让C dll调用cmd并执行编译VB.NET可执行文件并管道输出。 虽然这不是一个完全理想的解决方案,但是当我所需要的只是一个字符串时,它就能在这种情况下工作。

答案 2 :(得分:0)

除非这是您在任何地方使用的现有vb.net dll(业务层),否则我可能会建议不要在C应用程序中使用它。

有多种方法可以从C与MSSQL进行通信。可以是本机驱动程序,也可以是ODBC等。