注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

平台调用测试  

2014-04-12 17:25:57|  分类: C# & .NET |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在.NET中可以通过平台调用(P/Invoke)来调用采用C或者C++编写的动态链接库(dll),通过这种方式,提高了代码的重用,节省了开发时间。虽然,我们可以使用.NET语言重写原有的代码,但是现有的代码是经过反复锤炼经过验证的,因此,重写并不见得会有很明显的优势,而且,不同语言具有不同的特色,原本很容易实现的代码,在别的语言环境下来编写,可能会更麻烦。

今天测试了一下平台调用,主要分为两块,一个是编写本地dll文件,另一个工作是在C#中调用该dll文件中的函数。

第一步,编写dll文件

#include "main.h"
// a sample exported function
void DLL_EXPORT XDMessageBox(const LPCSTR sometext)
{
    MessageBox(0, sometext, "XDLib", MB_OK | MB_ICONINFORMATION);
}
int DLL_EXPORT __cdecl XDAdd(int a,int b)
{
    return a+b;
}

其中实现了两个函数XDAddXDMessageBox,头文件中是这样定义的:

#ifndef __MAIN_H__
#define __MAIN_H__
#include <windows.h>
/*  To use this exported function of dll, include this header
 *  in your project.
 */
#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"
{
#endif

    void DLL_EXPORT XDMessageBox(const LPCSTR sometext);
    int DLL_EXPORT __cdecl XDAdd(int a,int b);
#ifdef __cplusplus
}
#endif
#endif // __MAIN_H__

编译之后,生成了XDLib.dll文件。

接下来第二步就是是调用了。新建一个C# Console程序,然后添加命名空间:

using System.Runtime.InteropServices;

该命名空间包提供了DllImport等属性,然后实现代码如下:

using System;
using System.Runtime.InteropServices;

namespace PInvokeTest
{
    class Program
    {
        [DllImport(@"C:\XDLib.dll",CallingConvention=CallingConvention.Cdecl)]
        private static extern int XDAdd(int a,int b);

        [DllImport(@"C:\XDLib.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void XDMessageBox(string s);
        static void Main(string[] args)
        {
            int x = 123, y = 321;
            XDMessageBox("Hello, world!");
            Console.WriteLine(XDAdd(x, y).ToString());
        }
    }
}
调用的地址可以是相对地址,也可以绝对地址,如果采用相对地址,必须和可执行程序位于同一个目录下,或者系统目录下(例如常见的user32.dll,kernel.dll等),主要注意调用约定一定要和原始声明中的一样,否则会出现如下错误:
image
  评论这张
 
阅读(426)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016