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

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

互操作系列文章:

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

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

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

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

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

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

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

我们继续.NET互操作学习。互操作的基础知识已经差不多完了,当然一篇小小的文章很难全面的讲述互操作的方方面面,本人只是总结出关键的地方好让我们能入个门,在后期如果想要更深入的学习,肯定需要一本详细而全面的书籍才行。想要精通.NET互操作当然也少不了对非托管的技术学习,C++、COM等等,只有既熟悉.NET也熟悉非托管技术才能将互操作融会贯通。从这篇文章起我们将进入到.NET互操作的数据封送阶段,数据封送是.NET/Pinvoke关键的部分,任何托管代码想要和非托管代码互操作,少不了数据的传递返回;[王清培版权所有,转载请给出署名]

1:

在托管代码调用非托管代码的时候,数据经历了很复杂的封送。由于托管的数据类型与非托管的数据类型内存结构可能是不一样的,要想将托管数据参数传递到非托管代码中,并且能成功的接受到非托管的返回值,我们需要很严格的按照双方的数据类型约定来才行。比如在C++中的Char*是一个字符指针,当我们想要将字符串传递到非托管代码中时,我们需要考虑怎么将参数无差错的封送到非托管代码。而在托管C#中的String类型是一个引用类型,两者有相同点,也有不同点。

在我们用.NET/PInvoke进行Win32API的调用的时候,大多数的情况下我们是需要传递某种结构类型给API,然后在接受返回值;在数据封送的过程中,有些概念是我们平时不曾碰见的。.NET数据封送很智能,CLR的封送拆收器能通过识别我们传递的数据类型情况进行自动选择封送数据的方式,比如我们将一个Class的类类型传递给非托管API,默认的Class类是不能进行互操作使用的,必须加上相应的特性进行标记,编译器编译的时候能识别出这是要进行封送的数据类型;将Class类型进行封送时,封送拆收器会进行判断,如果我们传递给非托管代码的Class中的所有内部对象都是平台数据类型,那么CLR会将这个对象在内存中锁定,然后直接将内存地址封送给非托管代码,非托管代码直接对这数据进行操作。这是封送引用地址的方式,如果我们传递给非托管API的是非平台类型,那么CLR的封送拆收收器会将我们的托管类型复制出来进行非托管类型转换,然后将转换后的数据传递给非托管,这样的过程是复制数据的过程。互操作的数据封送基本上就是这两种,1数据的复制封送,2数据的内存地址封送;

下面我们用一副图来表达我上面所说的原理。

2:

如果托管的数据类型与非托管的数据类型在内存中是等价的,那么CLR进行封送的方式会很简单。如果托管的数据类型与非托管的数据类型是不等价的,那么CLR会进行相应复制转换操作,当然这样会丢失数据内存泄漏都是有可能的,但是我们不用怕,.NET为我们做好了很好的互操作桥梁,我们只要对要封送的数据进行一系列的设置就能很成功的进行数据封送了;

总结:这篇文章主要给大家介绍一下,关于托管与非托管的数据封送相关的概念,下面我们将学习互操作的数据封送;

目录
相关文章
|
Web App开发 C++
一起谈.NET技术,Silverlight3动态访问wcf
  网络上设置Silverlight动态访问WCF服务,大多是抛开ServiceReferences.ClientConfig文件,完全以代码方式实现对WCF的动态访问。但这种做法存在实现复杂和局限性。
878 0
一起谈.NET技术,基于CallContextInitializer的WCF扩展导致的严重问题
  WCF是一个具有极高扩展度的分布式通信框架,无论是在信道层(Channel Layer)还是服务模型层(Service Model),我们都可以自定义相关组件通过相应的扩展注入到WCF运行环境中。在WCF众多可扩展点中,ICallContextInitializer可以帮助我们在服务操作执行前后完成一些额外的功能,这实际上就是一种AOP的实现方式。
876 0
|
前端开发 开发工具
Silverlight同步(Synchro“.NET研究”nous)调用WCF服务
  Silverlight的RIA应用中访问远端的WebService或WCF服务,都是通过异步线程模式调用的。在某些情况下我们的调用是需要同步进行,虽然Silverlight没有内置同步线程模式调用远端服务接口,但是我们可以通过多线程的处理来伪装出同步调用的实现。
757 0
|
Web App开发 .NET Windows
一起谈.NET技术,从原理来看Silverlight 4的架构
  简介   在前文谈到要从多个方面来了解:Silverlight的原理,处理周期,部署,安全性,伸缩性,分布式计算能力,容错能力,等等等等。这篇从原理的角度来看Silverlight 4架构相关的一些事情。
1204 0
|
Web App开发 .NET
艾伟_转载:ASP.NET底层的初步认识与理解
  最近在国外的网站乱走一通,发现一些比较好的文章,收集整理加于自己的理解,作为笔记形式记录下来,让以后自己有个回忆。   ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用.
950 0
|
.NET 数据库
一起谈.NET技术,走向ASP.NET架构设计——第六章:服务层设计(前篇)
  本篇主要是为后文做铺垫,所以理论的东西相对而言比较的多一点!   服务层的概述   首先解释一下什么是”服务Service”,从广义来讲:只要是你使用了别人的东西,那么你就在使用别人提供的服务。在这里,服务就是指可能被一个或者多个系统使用的核心的业务逻辑,我们可以把服务简单的想象成为一些可供调用的API。
1170 0
|
Web App开发 存储 SQL
一起谈.NET技术,ASP.NET应用下基于SessionState的“状态编程框架”解决方案
  在一个基于ASP.NET的Web应用程序中,我们通常使用SessionState保存基于某个客户端的状态信息。但是这种单纯使用SessionState的编程方式具有很多局限,比如Session Item的Key值冲突,比如没有一个有效的SessionState清除机制会为Web Server带来内存压力。
1029 0
|
Web App开发 安全 .NET
一起谈.NET技术,保护您的 Silverlight 应用程序的安全
作为一名 Microsoft 服务顾问,我定期与客户和合作伙伴一起进行应用程序安全性讨论。 在本文中,我将介绍一些在这些讨论中提出的主题。 特别是,我将重点介绍编程人员在尝试保护 Silverlight 应用程序的安全时所面临的新挑战,而且我将考虑开发团队应该将其资源集中于哪些方面。
1239 0