locked
FAQ:2.21 在.NET代码中如何调用本地的C++的DLL? RRS feed

答案

  • 解决方案 1. (显式) P/Invoke
    解决方案2. 动态 P/Invoke
    解决方案3. 隐式 P/Invoke (使用一个 C++/CLI 封装类)
    解决方案4. 转换 C++ DLL 到一个 COM 服务组件, 并且在。Net代码中通过.NET-COM interop 对其进行调用

    解决方案 1. (显式) P/Invoke

    例子:

    ·           CppDynamicLinkLibrary (一个本地的C++ DLL模块,这个模块导出全局数据,全局函数和全局类)

    ·           CSPInvokeDll (一个 C#的应用程序, P/Invokes调用由CppDynamicLinkLibrary 导出的函数)

    ·           VBPInvokeDll (一个VB.NET 应用程序, P/Invokes调用由 CppDynamicLinkLibrary导出的函数)

    .NET中的使用平台调用服务(P/Invokes)允许托管代码调用在非托管DLLs执行和导出的非托管函数。C# 应用程序例子 CSPInvokeDll VB.NET 应用程序例子 VBPInvokeDll 演示了如何调用由本地C++ DLL CppDynamicLinkLibrary.dll 导出的函数。

    下载All-In-One Code Framework (Library) 软件包。

    PInvoke.png

    解决方案2. 动态 P/Invoke

    例子:

    ·           CppDynamicLinkLibrary (一个本地的C++ DLL模块,这个模块导出全局数据,全局函数和全局类)

    ·           CSLoadLibrary (一个 C#的应用程序, 动态地调用由CppDynamicLinkLibrary 导出的函数)

    ·           VBLoadLibrary (一个VB.NET 应用程序, 动态地调用由 CppDynamicLinkLibrary导出的函数)

    动态的P/Invode 服务是P/Invoke技术的补充,特别是当目标DLL不在P/Invoke的搜索路径时它很有用。如果您使用P/InvokeCLR首先会搜索在您程序集目录下的dll,之后搜索在PATH环境变量中定义的目录下的dll。如果dll不在之前提到的任何一个目录下,您必须使用动态P/Invoke技术。动态P/Invoke技术会通过调用LoadLibrary动态地下载本地DLL,还会通过调用GetProcAddressMarshal.GetDelegateForFunctionPointer来获取目标函数的地址。CSLoadLibrary and VBLoadLibrary 使用这个技术来动态下载和调用CppDynamicLinkLibrary.

    下载All-In-One Code Framework (Library) 软件包。

    PInvoke.png

     

    解决方案3. 隐式 P/Invoke (使用一个 C++/CLI 封装类)

    例子:

    ·           CppDynamicLinkLibrary (一个本地的C++ DLL模块,这个模块导出全局数据,全局函数和全局类)

    ·           CppCLINativeDllWrapper (一个封装了本地C++ DLL CppDynamicLinkLibrary C++/CLI)

    ·           CSCallNativeDllWrapper (一个C# 应用程序,这个应用程序通过CppCLINativeDllWrapper)调用CppDynamicLinkLibrary

    ·           VBCallNativeDllWrapper (一个 VB.NET 应用程序,这个应用程序通过CppCLINativeDllWrapper 调用 CppDynamicLinkLibrary)

    当和本地模型互通时,由Visual C++/CLI支持的互通性特征比起其他的.NET语言有一个特别的优势。除了传统的隐式 P/Invoke, C++/CLR还允许显式 P/Invoke,这也叫做C++ Interop, It Just Work (IJW), 它能够近乎无形地把托管代码和非托管代码混合。这个特性提供了更好的类型安全,更简单的编码,更强大的执行能力和更大的可容性如果本地API被改动。如果资源代码是可用的,我们可以使用这个技术创建一个封装了本地C++类和函数的.NET封装包,我们还可以通过这个封装包让所有的.NET客户去访问本地C++类和函数。

    下载All-In-One Code Framework (Library) 软件包。

    PInvoke.png

    解决方案4. 转换 C++ DLL 到一个 COM 服务组件, 并且在.Net代码中通过.NET-COM interop 对其进行调用。

    例子:

    ·           ATLDllCOMServer (转换一个本地的C++ DLL 成一个进程内的COM 服务器)

    ·           CSCOMClient (一个调用C++在进程内的COM服务器ATLDllCOMServerC# 应用程序)

    ·           VBCOMClient (一个调用C++在进程内的COM服务器ATLDllCOMServera VB.NET 应用程序)

     .NET 的应用程序例子 CSCOMClient VBCOMClient 调用一个从本地C++ DLL转换过来的进程内的COM服务器ATLDllCOMServer

    下载All-In-One Code Framework (Library) 软件包。

    PInvoke.png


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年2月28日 3:14