博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET简谈互操作(二:先睹为快)
阅读量:6334 次
发布时间:2019-06-22

本文共 1828 字,大约阅读时间需要 6 分钟。

互操作系列文章:

我们继续.NET互操作学习,为了揭开互操作的神秘面纱,今天这篇文章我们就来先睹为快,让我们先来做个例子,基础的东西,我们陆续进行讲解;由于互操作牵扯到的东西非常多,比较复杂,我们要循环渐进的学习,为了给大家有一定的吸引力,让我们一边看一边能动手做起来;本篇文章用VisualStudio2010进行演示,将非托管代码暴露在我们眼前,它对我们来说不在有神秘感,我们通过.NETP/invoke(平台调用)很方便的进行调用,可能需要我们掌握一些C++的基础知识,但是也放心啦,有C语言的基础功,足够用了;我们开始吧;

要想成功调用非托管代码我们需要一些准备工作;

1.需要知道非托管DLL文件有哪些导出函数是可以调用的,由于导出函数的方法的名称被重新整顿过了比如一个方法add(int number),整顿后为_add@4,为什么会这样我们后面进行讲解,这跟C++语法有点牵连,这里就不扯了;

2.在托管代码中定义非托管函数的申明,也就是我们.NET平台里的DLLImport特性,该对象是托管平台进行平台调用的核心对象,用它.NET引擎就知道该方法是在外部定义的;

3.用托管代码进行调用非托管方法;

下面我们就开始用VisualStudio2010进行演示,我们用Vs2010创建一个解决方案,里面包括托管与非托管两个项目;我给出非托管代码的创建图:

1:

选择VisualC++—>Win32—>Win32项目;

2:

这样我们就创建了非托管C++的开发环境;下面我们来编写C++的代码;我拿我自己事先创建好的项目做演示;

3:

我的非托管项目是Win32DLL,创建好后会有一个和项目名称一样的.cpp文件,这个是源代码文件,我们只需要在里面写点非托管操作的代码就行了;

// Win32DLL.cpp : 定义 DLL 应用程序的导出函数。

//

#include "stdafx.h"

extern "C" _declspec(dllexport) int _stdcall add(int x,int y)

{
 return x+y;
}

在文件Win32DLL.cpp文件里面我编写了一个add方法,仅仅作为演示使用;暂且我们不管他的具体语法;切换到托管代码中,我的代码如下:

using System;

using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace CSharp.Interop

{
    public static class InteropClass
    {
        [DllImport("Win32DLL.dll", EntryPoint = "add", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int AddNumber(int x, int y);
    }
}

这样我们就可以直接调用AddNumber方法进行调用了;

using System;

using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace CSharp

{
    class Test1
    {
        static void Main(string[] args)
        {
            try
            {
                int count = Interop.InteropClass.AddNumber(10, 20);
                Console.Write(count);

             }

            catch (DllNotFoundException errnot) { }
            catch (EntryPointNotFoundException errpoint) { }
        }
    }
}

总结:本篇文章的重点是想让大家看一下托管与非托管的整个生命周期是怎么来的,对托管非托管的代码之间的协调有个自己的思路,后面将详细的说明互操作中涉及的细节;

 本文转自 王清培 51CTO博客,原文链接:http://blog.51cto.com/wangqingpei557/595559,如需转载请自行联系原作者

你可能感兴趣的文章
60 Permutation Sequence
查看>>
主流的RPC框架有哪些
查看>>
Hive学习之路 (七)Hive的DDL操作
查看>>
[转]mysql使用关键字作为列名的处理方式
查看>>
awesome go library 库,推荐使用的golang库
查看>>
树形展示形式的论坛
查看>>
jdbcTemplate 调用存储过程。 入参 array 返回 cursor
查看>>
C++中的stack类、QT中的QStack类
查看>>
Linux常用基本命令[cp]
查看>>
CSS 相对|绝对(relative/absolute)定位系列(一)
查看>>
关于 Nginx 配置 WebSocket 400 问题
查看>>
Glide和Govendor安装和使用
查看>>
Java全角、半角字符的关系以及转换
查看>>
Dubbo和Zookeeper
查看>>
前端项目课程3 jquery1.8.3到1.11.1有了哪些新改变
查看>>
UOJ#179. 线性规划(线性规划)
查看>>
整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
查看>>
windows的服务中的登录身份本地系统账户、本地服务账户和网络服务账户修改
查看>>
JAVA中循环删除list中元素的方法总结
查看>>
redis 安装
查看>>