logo

详解VS2010调用非C#编写的DLL文件的方法

时间:2011-5-10 9:19:25 来源:博客园 作者:李平

我们今天要谈到的Visual Studio 2010上使用C#调用非托管C++生成的DLL文件,希望对大家有所帮助。

背景

在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。本篇文章将引导你快速理解这个调用的过程。

步骤

1. 创建一个CSharpInvokeCPP的解决方案:

image

2. 创建一个C++的动态库项目:

image

3. 在应用程序设置中,选择“DLL”,其他按照默认选项:

image

最后点击完成,得到如图所示项目:

image

我们可以看到这里有一些文件,其中dllmain.cpp作为定义DLL应用程序的入口点,它的作用跟exe文件有个main或者WinMain入口函数是一样的,它就是作为DLL的一个入口函数,实际上它是个可选的文件。它是在静态链接时或动态链接时调用LoadLibrary和FreeLibrary时都会被调用。详细内容可以参考(http://blog.csdn.net/benkaoya/archive/2008/06/02/2504781.aspx)。

4. 现在我们打开CSharpInvokeCPP.CPPDemo.cpp文件:

现在我们加入以下内容:

  1. // CSharpInvokeCPP.CPPDemo.cpp : 定义 DLL 应用程序的导出函数。   
  2.  //   
  3. #include "stdafx.h"   
  4.  extern "C" __declspec(dllexport) int Add(int x, int y)   
  5.  {   
  6.  return x + y;   
  7. }   
  8.  extern "C" __declspec(dllexport) int Sub(int x, int y)   
  9.  {   
  10.  return x - y;   
  11.  }   
  12.  extern "C" __declspec(dllexport) int Multiply(int x, int y)   
  13. {   
  14.  return x * y;   
  15. }   
  16.  extern "C" __declspec(dllexport) int Divide(int x, int y)   
  17.  {   
  18. return x / y;   
  19. }   
  20.  

extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。而被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。

__declspec(dllexport)的目的是为了将对应的函数放入到DLL动态库中。

extern "C" __declspec(dllexport)加起来的目的是为了使用DllImport调用非托管C++的DLL文件。因为使用DllImport只能调用由C语言函数做成的DLL。

5. 编译项目程序,最后在Debug目录生成CSharpInvokeCPP.CPPDemo.dll和CSharpInvokeCPP.CPPDemo.lib

image

我们用反编译工具PE Explorer查看下该DLL里面的方法:

image

可以发现对外的公共函数上包含这四种“加减乘除”方法。


文章分页12
标签:
100%

回复:详解VS2010调用非C#编写的DLL文件的方法

0 / 5000