当前位置: 首页 > wzjs >正文

网站建设需求分析范例wordpress列表图片

网站建设需求分析范例,wordpress列表图片,深圳市建设厅,学习软件有哪些.NET学习资料 .NET学习资料 .NET学习资料 在 C# 编程领域中,封送(Marshaling)和远程编程(Remote Programming)是两个极为重要的概念,它们为开发者提供了与不同环境、不同进程或不同机器上的代码进行交互的…

.NET学习资料

.NET学习资料

.NET学习资料


在 C# 编程领域中,封送(Marshaling)和远程编程(Remote Programming)是两个极为重要的概念,它们为开发者提供了与不同环境、不同进程或不同机器上的代码进行交互的能力,极大地拓展了应用程序的功能和适用范围。

一、C# 封送

(一)定义与作用

封送是指在托管代码(如 C# 编写的代码,由公共语言运行时 CLR 管理)和非托管代码(如 C、C++ 编写的代码,没有 CLR 参与)之间进行数据转换和传递的过程。不同编程语言和环境在调用约定、布局约定、基本数据类型大小、对象创建与销毁约定以及设计准则等方面存在差异。例如,C# 中的char类型和 C 中的char类型在大小和编码方式上可能不同。因此,需要封送来解决这些差异,确保数据能够在不同环境之间正确传递和理解 。它就像是一座桥梁,连接着托管世界和非托管世界,使得两者能够进行有效的通信。

(二)常见的封送类型及处理方式

blittable 类型

像byte、short、int、long等及其无符号对应类型,这些类型在托管和非托管代码之间传递时,不需要特殊的封送处理,因为它们在不同环境中的内存布局和表示方式是一致的,可以直接进行数据传输。

非 blittable 类型

字符串类型:在 C# 与非托管代码交互时,若要将string封送到非托管函数,可以使用Marshal.StringToHGlobalAnsi、Marshal.StringToHGlobalAuto、Marshal.StringToHGlobalUni等方法 ,操作完成后需调用Marshal.FreeHGlobal释放内存;从非托管函数中取出string则可使用Marshal.PtrToStringAnsi、Marshal.PtrToStringAuto、Marshal.PtrToStringUni。例如,当调用一个非托管的 C 函数,该函数接收一个 ANSI 编码的字符串参数时,就可以使用Marshal.StringToHGlobalAnsi将 C# 中的string转换为符合要求的非托管内存中的字符串形式。

数组类型:对于byte[](或其他基础类型的数组),可以使用Marshal.Copy方法实现从byte[]拷贝封送到非托管函数,或从非托管函数拷贝封送到byte[] 。另外,还可以采用固定内存直接传送byte[]的原始地址的方式(这种方式省去了申请内存和拷贝的开销,速度更快),具体是使用GCHandle并指定GCHandleType.Pinned类型。假设需要将一个字节数组传递给非托管代码进行快速处理,固定内存地址的方式就能提高数据传输效率。
委托类型:从delegate封送到非托管函数可使用Marshal.GetFunctionPointerForDelegate,从非托管函数中取出则使用Marshal.GetDelegateForFunctionPointer 。在封送到非托管函数时,要确保垃圾回收器(GC)不会回收委托,通常需要保持引用但不需要将其固定。比如在实现回调函数机制时,就可能涉及委托类型的封送。

结构体类型:在 C# 中按相同顺序和对应数据类型声明一个同样的struct(只能使用基础类型和固定长度的数组),并且标记StructLayout的LayoutKind.Sequential属性,然后利用Marshal.StructureToPtr和Marshal.PtrToStructure进行封送。当与非托管代码进行结构体数据交互时,这种方式能保证数据结构的正确传递。

(三)自动封送与手动封送

自动封送:当 C# 声明的extern函数返回类型和参数类型中有托管类型(如string、byte[]、委托等)时,CLR 会自动进行封送处理,这大大节省了开发者编写封送代码的时间和精力。例如,在调用一个非托管的 DLL 函数,该函数的参数是一个字符串时,C# 代码中无需额外编写复杂的封送代码,CLR 会自动完成字符串类型的封送转换。
手动封送:在某些特殊情况下,自动封送无法满足需求,就需要手动进行封送。比如当string的编码是 UTF - 8 之类的非 ANSI 非 UTF - 16 编码时,必须手动进行封送并同时转换编码;又或者委托转换成函数指针的操作比较耗时,如果有频繁的对同一委托进行封送调用,预存转换后的结果能够显著提升性能,此时也需要手动进行封送处理。

二、C# 远程编程

(一).NET Remoting 框架概述

.NET Remoting 是一种分布式处理框架,它允许对象通过应用程序域与另一对象进行交互 ,可以看作是 DCOM 的一种升级,并且很好地融合到了.NET 平台下。其核心优势在于提供了一种灵活且抽象的进程间通信方式,使得开发者无需关注具体的客户端或服务器应用程序域,也无需关心特定的通信协议,就能实现不同应用程序域甚至不同机器上的对象之间的通信。

(二)主要组件

可远程处理的对象(Remoteable Object):这是需要在远程环境中被访问和调用的对象。它必须继承自MarshalByRefObject类,以便能够跨越应用程序域进行通信。例如,一个实现了业务逻辑的服务类,希望被远程客户端调用其方法,就可以让这个类继承MarshalByRefObject。

远程监听应用程序(Remote Listener Application):负责监听对远程对象的请求。它创建并注册通信通道,同时注册远程对象,使其能够被远程客户端发现和访问。比如在服务器端,通过创建一个 TCP 或 HTTP 通道,并将远程对象注册到该通道上,等待客户端的连接请求。

远程客户端应用程序(Remote Client Application):向远程对象发出请求。客户端通过 Remoting 框架,访问通道以获取服务器端对象的引用,然后通过该引用调用远程对象的方法。在客户端代码中,首先创建一个与服务器端对应的通道,然后使用Activator.GetObject等方法获取远程对象的引用,进而调用其公开的方法。

(三)通信原理与通道

通信原理:在 Remoting 中,客户端获取服务器端对象时,得到的并不是实际的服务端对象,而是它的引用,这保证了客户端和服务器端对象的松散耦合,同时优化了通信性能。客户端通过通道发送请求消息,服务器端通过相应的通道接收请求并处理,然后将结果通过通道返回给客户端 。整个过程就像是客户端和服务器端通过一条 “通信管道” 进行交互,而这条 “管道” 就是通道。

通道类型:主要支持 TCP(传输控制协议)和 HTTP(超文本传输协议)通道。使用 TCP 通道时,数据以二进制形式传输,效率较高,适合在内部网络环境中使用;而 HTTP 通道则基于 HTTP 协议,数据以 SOAP(简单对象访问协议)格式传输,具有更好的跨平台和跨网络环境的兼容性,适合在 Internet 等复杂网络环境中使用。

(四)代码示例

定义远程对象
using System;
namespace RemoteObject
{public class MyRemoteObject : MarshalByRefObject{public MyRemoteObject(){}public int Add(int a, int b){return a + b;}}
}
服务器端代码
using System;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteObject;namespace RemoteServer
{class Program{static void Main(string[] args){// 创建TCP服务器通道,端口号为8080TcpServerChannel channel = new TcpServerChannel(8080);// 注册通道ChannelServices.RegisterChannel(channel, false);// 注册远程对象,对象URI为"MyRemoteObject",激活模式为单例RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyRemoteObject), "MyRemoteObject", WellKnownObjectMode.Singleton);Console.WriteLine("服务器已启动,等待客户端连接...");Console.Read();}}
}
客户端代码
using System;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteObject;namespace RemoteClient
{class Program{static void Main(string[] args){// 创建TCP客户端通道TcpClientChannel channel = new TcpClientChannel();// 注册通道ChannelServices.RegisterChannel(channel, false);// 获取远程对象引用MyRemoteObject remoteObject = (MyRemoteObject)Activator.GetObject(typeof(MyRemoteObject), "tcp://localhost:8080/MyRemoteObject");// 调用远程对象的方法int result = remoteObject.Add(3, 5);Console.WriteLine("调用远程方法结果: " + result);Console.Read();}}
}

通过以上对 C# 封送和远程编程的介绍,希望能帮助你深入理解这两个重要概念及其在实际开发中的应用。如果你对代码实现细节、原理有进一步的疑问,或者想要了解更多相关应用场景,欢迎随时交流。


文章转载自:

http://v0p80bnx.hxLpm.cn
http://BzToILfc.hxLpm.cn
http://ZbAvyzat.hxLpm.cn
http://dE3e76Qk.hxLpm.cn
http://RSKldMDM.hxLpm.cn
http://IBNimj0c.hxLpm.cn
http://74PVhIdR.hxLpm.cn
http://Z20csmMr.hxLpm.cn
http://UvDitdo9.hxLpm.cn
http://SDL1kwPU.hxLpm.cn
http://OHDbMjm6.hxLpm.cn
http://chusQkXh.hxLpm.cn
http://a7rXYyqt.hxLpm.cn
http://U3YKpxSn.hxLpm.cn
http://ixWIizkn.hxLpm.cn
http://dZ0qZHcm.hxLpm.cn
http://3LLEGG2e.hxLpm.cn
http://03ATkpBa.hxLpm.cn
http://ASGwcl5X.hxLpm.cn
http://ZgC8MrYN.hxLpm.cn
http://8pmNL2oP.hxLpm.cn
http://nHFppwbT.hxLpm.cn
http://DvrIL2Lg.hxLpm.cn
http://HNtfRm5L.hxLpm.cn
http://2oLhndUu.hxLpm.cn
http://8wkoyP1a.hxLpm.cn
http://YkrP8XLn.hxLpm.cn
http://3lTdVtln.hxLpm.cn
http://SzdLJJuk.hxLpm.cn
http://Gh97ixlp.hxLpm.cn
http://www.dtcms.com/wzjs/759962.html

相关文章:

  • 培训行业网站建设中国最火的网站
  • 成都网站空间创新互联wordpress 修改 注册
  • 设计做网站域名哪里注册
  • 定做网站多少钱wiz wordpress
  • 如何用eclipse做网站dedecms 音乐网站模板
  • 给人做违法网站规避网站建设的运营计划书
  • 郑州大型网站建设价格常州免费做网站
  • 商丘做网站建设凡客官方网店
  • 如何评价企业网站推广效果?制作网站时搜索图标如何做
  • 西安网站群搭建网站建设伍金手指下拉6
  • 做催收的网站网站建设典型经验
  • 新会网站设计个体营业执照怎么年审
  • 做58同城的网站要多少钱百度推广管家登录
  • 网站集约化建设优点美食网站联系我们怎么做
  • 优秀的店面空间设计网站wordpress 解析漏洞利用
  • 南宁网站建公司电话号码九江市区
  • 做网站不错的公司网站做ddns解析
  • 如何做自己的小说网站网站设计平台
  • 邯郸市网络建站万州电商网站建设
  • 如何建设一个博客网站企业做网站哪家便宜
  • 网站改版案例网站搜索引擎优化方案论文
  • 手机扁平化网站模版网站开发流程丽江
  • 学校专业群建设专题网站淮安市哪里可以做网站
  • 双井网站建设公司建企业网站步骤
  • dw做的网站怎么做后台子页网站设计
  • 设计公司网站建设模板图计算机软件网站建设
  • 谷城网站建设网易企业邮箱网页版登录入口
  • 做美术鉴赏网站的心得狭义的网络营销是什么
  • 有哪些可以做翻译兼职的网站搞笑图片网站源码
  • 网站开发都有谷歌云 搭建wordpress