zoukankan      html  css  js  c++  java
  • C#调用c++创建的dll

    在C++创建DLL,以及使用C++或者C#分别调用DLL中的方法,环境VS2005。
    VS2005中很多工程都可以生成DLL,例如atl,mfc,win32等等。选择Win32,步骤如下:

    1:新建项目TestDLL,选择win32中的win32控制台应用程序,在“应用程序设置”中,选择“应用程序类型”为DLL,并将下方的附加选项勾上“空项目”,就可以了。  
    2:添加一个C++类,这时vs2005会生成TestDLL.h和TestDLL.cpp的文件,在.h文件中,键入如下代码:

     #define LIBEXPORT_API extern "C" __declspec(dllexport) 

     LIBEXPORT_API int f( char * ch);

    //这是一个测试程序  
    3:然后在.cpp文件中,必须加入DllMain函数以作为程序出口,并实现函数f:

     BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)

     {

    //程序出口    

      return TRUE;

     }  
    //函数的实现在这里 LIBEXPORT_API int f(char * ch)

     {    

      return 88;

    }  
    4:编译生成,就能得到与项目同名的TestDLL.dll。

    注意,生成的dll文件在外面的一个debug文件中。
    接下来该怎么调用dll,分别在C++和C#做了调用。调用过程如下:

     C++调用:

     1:首先将dll文件加入工程,拷贝dll置于c++项目文件所在的目录。

     2:调用代码   typedef int (*TEST) (char * ch);

    //定义调用DLL函数的类型  

     //下面是调用过程

      HINSTANCE hDLL;    TEST f;   hDLL = LoadLibrary(_T("TestDLL.dll"));

    //加载动态链接库TestDLL.dll文件; 

      f = (TEST)GetProcAddress(hDLL,(LPCSTR)"f");

    //调用的f函数  

     int si ;   si = f("abc");   

     FreeLibrary(hDLL);

    //卸载TestDLL.dll文件;   

     cout<<si;  

     return 0;

    3:结果——屏幕返回88,正确地调用了dll中的方法。 


    C#调用:

     1:将dll文件拷贝至C#执行文件所在目录,一般在/bin/debug目录下;

     2:调用代码  

    using System.Runtime.InteropServices;

      ... 

      ...     

     class CallDLL   

       {

    //使用一个类封装所有dll的函数   

           [DllImport("TestDLL.dll", EntryPoint = "f",  

                CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

    //指定dll访问入口     

         public static extern int  f(string s);

    //定义调用dll中函数的类型     

     } ...

     //使用dll中的函数

     int m = CallDLL.f("mmm");

    3:结果m的值正是88,操作成功。

  • 相关阅读:
    Python核心编程——正则表达式
    Python 随笔之Redis
    我的第一个Python随笔
    python练习题-day20
    python练习题-day19
    python练习题-day18
    python练习题-day16
    python练习题-day15
    python练习题-day14
    python练习题-day13
  • 原文地址:https://www.cnblogs.com/wwb0111/p/3098971.html
Copyright © 2011-2022 走看看