因此,经过大约一天半的时间,我取得了零进展。
我需要用C写一个DLL,它是一个现有应用程序的插件。DLL必须由Visual 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:\PLM2T-RAC\TcEx press53 53\包括”-I"C:\Program (X86)\8\VC\包括“-c -nologo -EHsc -W1 -Ox -Oy:\mydir\myDll.c”
然后将其链接到应用程序库的。
它实际上需要做的,以及导致问题的是,在其中一种方法中,它需要从server 2008 r2中提取数据。
从我今天看到的情况来看,您将无法在C中直接做到这一点,因为Server过去的2005年是设计用来与CLR语言( C#、C++、VB.Net)通信的。
建议我处理与VB.Net dll的所有数据库通信,然后从C dll中调用said函数。
关于从非托管代码调用托管dll的主题,我发现的大部分内容都谈到了pinvoke或com包装器,主要是从c++的角度。
我对COM或任何提到的技术都没有经验,所以如果有人能帮忙的话,我会非常感激的。
发布于 2012-06-29 18:43:46
我解决这个问题的方法是让call调用cmd并执行一个编译VB.NET可执行文件,并将其输出管道。虽然这不是一个完全理想的解决方案,但在这种情况下,当我只需要返回一个字符串时,它就起了作用。
发布于 2012-05-30 17:38:02
您有很多选项可以这样做,但并不是所有的选项都是琐碎的。
混合模式装配
向C客户机导出托管代码的第一个更简单的方法是使用C++/CLI编写代码(或者使用该语言编写包装器)。您只需导出所需的C函数,就像在普通的非托管代码中所做的那样,在它们的实现中调用所需的托管函数。这里是MSDN。
COM互操作
将托管类导出为COM对象。从非托管代码中可以看到普通的COM对象,看看这里。
反向P/Invoke
你可以用不同的方式来做。更简单的方法是恢复观点。如果您有一个VB.NET程序集(vbnet.dll)和一个C库(purec.dll),您可以想象的第一件事就是在purec.dll中向vbnet.dll添加一个依赖项。如果您这样做,您必须使用COM或使您的应用程序成为.NET主机。更简单的方法是还原:在purec.dll中添加依赖项(使用P/Invoke)。您的C接口将导出一个可以用函数指针填充的struct (例如),您将在VB.NET中填充该struct (作为委托),C代码只需调用它们。看看这里。
其他选项
本机主机:这是一条艰难的道路。本地应用程序将承载.NET应用程序。这是一个漫长而复杂的过程,如果你只需要导出几个函数的话,那就太复杂了。我在这里发帖子只是为了参考:托管MSDN概述。
IPC.您可以将您的应用程序分开,并且彼此可以忽略另一个应用程序是如何编写的。只需定义一个接口和一个连接它们的通道(命名为管道、共享内存或其他任何东西,请查看这里查找列表)。如果您的VB.NET应用程序是一个服务,或者它是由一个正在运行的应用程序承载的,如果它只是导出很少的函数,那么它就可以工作。
发布于 2012-05-30 17:25:39
除非这是您在任何地方使用的现有vb.net dll (业务层),否则我建议您不要在C应用程序中使用它。
C与MSSQL的通信方式有多种,无论是通过本机驱动程序还是通过ODBC等。
https://stackoverflow.com/questions/10821109
复制相似问题