.NET简谈互操作(二:先睹为快)

互操作系列文章:

  1. .NET简谈互操作(一:开篇介绍)

  2. .NET简谈互操作(二:先睹为快)

  3. .NET简谈互操作(三:基础知识之DllImport特性)

  4. .NET简谈互操作(四:基础知识之释放非托管内存)

  5. .NET简谈互操作(五:基础知识之Dynamic平台调用)

  6. .NET简谈互操作(六:基础知识之提升平台调用性能)

  7. .NET简谈互操作(七:数据封送之介绍)

我们继续.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) { }
        }
    }
}

总结:本篇文章的重点是想让大家看一下托管与非托管的整个生命周期是怎么来的,对托管非托管的代码之间的协调有个自己的思路,后面将详细的说明互操作中涉及的细节;[王清培版权所有,转载请给出署名]

时间: 2024-10-23 00:35:28

.NET简谈互操作(二:先睹为快)的相关文章

.NET简谈互操作(五:基础知识之Dynamic平台调用)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之Dispose非托管内存) .NET简谈互操作(五:基础知识之Dynamic平台调用) .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 我们继续.NET互操作学习.在上篇文章中我们学习了关于托管与非托管内存Dispose(释放)问题:下面我们继续学习基础知识中的Dyn

.NET简谈互操作(七:数据封送之介绍)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之Dispose非托管内存) .NET简谈互操作(五:基础知识之Dynamic平台调用) .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 我们继续.NET互操作学习.互操作的基础知识已经差不多完了,当然一篇小小的文章很难全面的讲述互操作的方方面面,本人只是总结出关键的地

.NET简谈互操作(一:开篇介绍)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之释放非托管内存) .NET简谈互操作(五:基础知识之Dynamic平台调用) .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 本人最近在学习非托管C++互操作的技术,有点小收获不敢私藏拿出来跟大家分享:作为.NET开发人员,我们有必要学习一些互操作方面的知识:尤其对一

.NET简谈互操作(六:基础知识之提升平台调用性能)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之Dispose非托管内存) .NET简谈互操作(五:基础知识之Dynamic平台调用) .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 我们继续.NET互操作学习.本篇文章我们将来学习互操作基础知识中的最后一个知识点"提升平台调用的性能": 在于非托管函数进

.NET简谈互操作(三:基础知识之DllImport特性)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之释放非托管内存) .NET简谈互操作(五:基础知识之Dynamic平台调用) .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 我们继续.NET互操作学习,上一篇文章中我们介绍了托管代码怎么与非托管代码C++之间的互操作:要想在托管代码中成功的进行非托管调用,要注意的细

.NET简谈互操作(四:基础知识之Dispose非托管内存)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之Dispose非托管内存) .NET简谈互操作(五:基础知识之Dynamic平台调用)  .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 我们继续.NET互操作学习.前一篇文章中我们学习了基础知识中的DllImport关键特性:我们继续学习基础知识中的内存释放相关技术

.NET简谈静态事件链

在我们日常开发过程中经常会遇到多个类实例之间的关联,不管是B/S还是C/S的项目,在对实例的使用是一样的:只不过C/S的项目比较好控制,不管是UI层的对象都能很好的控制,包括继承.重写等等:而在B/S里面可能不太方便,由于B/S本身的特点,不能暴露内部太多的继承关系,以免不小心破坏类的封闭性:我这篇文章主要是讨论在多个类实例之间怎么进行动态关联,比如我们在开发Winform项目的时候,可能会碰到两个或多个窗口之间协同工作的情况:本人在这种情况下采用的是静态事件链的解决方案,多个实例之间不存在主次

作为个人SEOer该如何谈单(二)

5号我发表过一篇关于seoer谈单的一些经验,自己又想起来很多谈单过程遇到的问题,特此写第二篇关于谈单的文章和广大seoer同行分享.也许是因为地域问题或者其他问题,我发现每个地方的客户对seo理解都不相同,比如说北京的客户,对网络比较敏感,而且大部分客户相对了解seo,也了解做seo给他带来的利益,但是有很大地方客户还是比较生疏,只知道排名,甚至怎么利用排名带来效益都不清楚.下面优百网络继续和大家分享:作为个人seoer该如何谈单二. 第一类客户:无网站并且对seo不了解 首先和这类客户谈单相

信息架构中信息类粒化简谈

当我们进一座写字楼的时候,找你想要去的房间,你会依据什么来指引到那个房间?当你到超市买东西的时候,什么东西指引你可以很快的找到你要去物柜?当你到达一个网站的时候,你依靠什么找到你要的信息?什么样的方式可以让你更加快捷的找到你所关注的目标信息?这时候,一个写字楼的楼层房间分布图谱,一个超市的物品分类,一个网站的信息架构就显示出它的作用了. 当我们找那个目标房间具体信息,房间的位置,朝南还是朝北,房间大小,距离电梯的距离等等,超市找物柜里面的物品,找红酒还是白酒,什么品牌,价格,是否有促销,是自己品