引言
ASP.NET 是一个流行的 Web 开发框架,用于构建动态、交互式 Web 应用。为您的 ASP.NET 项目选择合适的托管空间提供商至关重要,因为它将影响您的应用的性能、可靠性和安全性。本文将提供一个全面的指南,帮助您选择最适合您项目的供应商。
托管空间类型的比较
在开始之前,了解不同类型的托管空间很重要:
- 共享托管:多个网站托管在同一服务器上,共享资源。
- 虚拟专用服务器 (VPS):一个虚拟服务器,拥有专用的资源,但与其他服务器共享物理硬件。
- 专用服务器:一个物理服务器,专门用于托管您的网站。
选择托管空间提供商时要考虑的因素
以下是一些在选择托管空间提供商时需要考虑的关键因素:
- 价格:托管空间的费用差异很大,因此在做出决定之前比较不同提供商的价格非常重要。
- 性能:托管空间的速度和可靠性对于确保您的应用顺畅运行至关重要。
- 功能:考虑您需要的功能,例如数据库支持、安全性措施和技术支持。
- 客户服务:在出现问题时,要有可靠的支持团队可以提供帮助至关重要。
- 声誉:研究潜在提供商的在线评论和推荐信,以获得对其声誉的了解。
为 ASP.NET 项目推荐的托管空间提供商
以下是为 ASP.NET 项目提供一些推荐的托管空间提供商:
- Azure App Service:微软的云托管服务,提供无服务器和虚拟机托管选项。
- AWS Elastic Beanstalk:亚马逊的云托管服务,针对 ASP.NET 应用进行了优化。
- SiteGround:一家提供共享、VPS 和专用托管的流行提供商,以其对 ASP.NET 的支持而闻名。
- Bluehost:一家提供低成本共享托管的提供商,非常适合小型 ASP.NET 网站。
- GoDaddy:一家提供各种托管选项的知名提供商,包括为 ASP.NET 设计的托管空间。
结论
为您的 ASP.NET 项目选择最佳托管空间提供商需要考虑多个因素。通过比较不同的托管空间类型、评估提供商的功能和声誉以及阅读在线评论,您可以找到最适合您项目的供应商。通过选择一个可靠、高性能的托管空间,您可以确保您的 ASP.NET 应用以最佳状态运行。
2024年3月运动护具攻略(41)TOP运动护膝品牌01:ZAMST赞斯特(3.24更新)
【2024年3月运动护具权威指南】第41期:ZAMST赞斯特品牌精选(2024.3.24更新)
自2023.03.18首发以来,我们持续关注并更新运动护具市场动态,为您提供最全面的资讯。ZAMST,这个自1992年巴塞罗那奥运会起家的国际知名品牌,以其出色的产品赢得了众多运动名将和NBA球星的认可。
赞斯特护膝推荐
赞斯特的护膝产品系列丰富多样,如JK-1、RK-1和EK-5,价格亲民,无论你是篮球爱好者、马拉松跑者还是极限运动爱好者,都能找到适合自己的那一款。
更多品牌推荐
除了赞斯特,我们还为您推荐Bauerfeind、迈克达威、DONJOY等知名品牌,各有其独特的技术和设计。同时,LP欧比、ZAMST等品牌也在运动护具领域占据一席之地。
关注我们“欢喜哥削苹果系列”,我们将为您带来更多运动护具的全面指南,包括护腰、护臀、按摩器材以及护颈、工学椅等全方位健康护理解决方案,满足不同人群的需求,如上班族、久坐族和学生党。
户外品牌精选
在全球户外品牌中,美国的黑钻、北面和哥伦比亚,欧洲的Rab HALTI、猛犸象等,都是值得信赖的户外装备提供商。露营装备方面,牧高笛、骆驼等品牌的天幕和帐篷同样备受好评。
骑行爱好者不可错过公路车品牌崔克、头盔品牌闪电和Yaphtes,而滑雪装备方面,Nobaday、Burton等品牌的滑雪服和滑雪板,为您的冬季运动保驾护航。
让我们一起探索运动护具的世界,为健康与舒适保驾护航,尽在2024年3月的运动护具攻略。
如何选择IDC服务商
成都鹏博士电信传媒集团股份有限公司(原名成都鹏博士科技股份有限公司、成都工益冶金股份有限公司)成立于1985年1月,1994年1月3日,公司股票在上海证券交易所挂牌上市;股票简称:鹏博士;股票代码。公司目前主要从事电信增值服务、网络监控、网络传媒业务,拥有独立的研发、生产、采购和销售系统,具有独立完整的业务及自主经营能力。
电信增值服务:公司专业从事基于城域光纤网络基础设施的电信增值服务业务,主要包括互联网专线接入、电子政务、互联网数据中心(IDC)、专网构建及运营以及网络安全监控、城市监控、长话分流等网络增值服务,目前拥有13,000多公里的城域光纤网,城域网覆盖整个北京城区,是北京市主要的“最后一公里”网络运营商。公司在高端商业客户互联网专线接入的市场份额达到50%,网吧专线接入市场份额接近100%,互联网数据中心业务也占有较高的市场份额。除进一步巩固和拓展现有的优势业务高端商业客户专线接入和互联网数据中心外,公司目前正在大力拓展社区个人家庭用户市场的光纤接入业务,进一步补充和扩大公司城域网覆盖范围,掌握终端客户资源。
网络监控业务:公司重点建设“平安北京”城市安防监控网络系统项目,即配合北京市公安部门,在北京市建成城市安防监控网络系统并负责后续的运营,该监控网络系统包括对内保单位提供监控摄像头安装、线路连接、资料存储、监控中心建设、维护服务、运营服务等。在成功完成“平安北京”项目后,公司将充分利用积累的技术经验、运营经验,作为城市安防体系框架的搭建者,继续发展其他专项安全防护监控项目和业务。
网络传媒业务:是公司正在拓展的新业务,公司依托独有的光纤网络资源,利用CDN加速与分布技术,与公司现有的网络资源、数据图像及视频分发技术和业务相整合,进行网络媒体服务和内容传输业务,为用户提供视频业务服务,快速促进公司电信增值服务业务的拓展和客户资源的扩大。
未来,公司将依托独有的光纤网络资源,继续大力发展光纤接入及IDC业务、加快拓展“平安北京”网络监控及相关安保业务、逐步拓展网络传媒业务,着力打造公司基于网络基础的电信增值服务和系统集成服务的优势地位,把公司建设成为基于互联网络的综合性服务公司。
北京电信通电信工程有限公司简称电信通,以下简称电信通。电信通是A股上市公司成都鹏博士电信传媒集团股份有限公司(A股代码)专营IDC互联网数据中心和ISP互联网接入业务的全资子公司,电信通是目前国内为数不多规模的中立于各电信运营商的互联网基础服务提供商主机托管数据中心。电信通旗下集合了原电信通的主机托管机房资源、ISP光纤城域网资源和上海帝联的CDN网络,电信通主营主机托管数据中心、CDN、带宽批租业务,2008年电信通年营业额近5亿元,电信通是国内最大的民营主机托管数据中心业务运营商。
自建有国内最大规模的中立主机托管数据中心机房
电信通在北京已建有电信通惠普机房、电信通中关村机房、电信通苏州桥机房和电信通三元桥机房四大电信级高标准主机托管机房,总面积近平米,资产总计2.5亿元,电信通机房全部位于三环路边,地理位置优越,交通便利,密集覆盖了国贸CBD、中关村和燕莎三大商圈,电信通是北京主机托管数据中心市场继原网通之后的最大主机托管运营商。电信通主机托管机房全部按照电信级最高标准建设,电信通拥有双路供电、精密空调、气体消防、环境监控等一系列高标准主机托管保障设施。
电信通主机托管是国内率先汇聚中国电信、中国网通、中国联通、中国铁通、教育网、科技网等各大互联网网络资源的主机托管数据中心运营商,电信通拥有多个独立的自治域,电信通与各大电信运营商均建有BGP连接,主机托管有效解决了运营商之间的互联互通问题,满足了来自不同运营商网络的访问需求。目前,电信通总互联带宽接近100G,全网处理能力超过400Gbps,电信通拥有其它中立主机托管数据中心运营商无法比肩的主机托管带宽资源优势。
电信通依托雄厚的出口资源,和涵盖全市所有网吧、近万企业用户、逾十万社区个人用户的独特城域网用户资源。电信通拥有搜狐、九城、联众、盛大、三星、公安部等众多主机托管顶级用户。
位于雍和宫北侧的电信通第五个主机托管机房,也是电信通的旗舰机房--电信通雍和宫机房业已破土动工,面积超过4300平米,预计于2009年底投产开展主机托管业务。加上刚刚投产的电信通苏州桥主机托管机房和电信通三元桥主机托管机房C区,未来一年,电信通将有超过1500个高品质的主机托管机柜投放市场,更加巩固了电信通在北京中立主机托管机房领域的主机托管霸主地位。
超越行业第一的CDN网络
为加快主机托管数据业务发展,07年电信通战略收购了CDN领域排名第三的上海帝联公司,依托鹏博士的资金及主机托管网络资源优势,整合后的CDN业务得以迅猛发展。电信通上海帝联公司目前在北京、广州、深圳、天津、沈阳、重庆、成都、长沙、武汉等地设立了多个分公司及办事处,拥有的市场份额快速增长,营业收入由并购前的8700万(2007年)直接增长到1.4亿(2008年),预计在2009年将超越业界第一的CDN运营商公司,成为国内最大的CDN运营商。
2008年,电信通上海帝联进一步加大资源部署力度,在全国各主要城市已拥有20个核心机房,180多个节点,带宽储备突破300G,网络节点设备超过6000台,形成了覆盖广、稳定强、价格优的高品质互联网资源。电信通上海帝联自主研发的“EasyCDN”网络加速技术,获得国家级认证,突破了传统的技术瓶颈,通过引入主动的内容管理层和全局负载均衡,并结合内容缓存等技术,为用户构建了一个在现有的IP网络基础上为宽带业务支撑而优化的中间层,使终端用户能以最快的速度,从最接近终端用户的地方获得所需的内容信息,彻底解决网络拥塞,提高响应速度和服务质量。
2007年帝联荣获全国主机托管数据中心产业“最佳技术创新奖”、“CDN技术先锋奖”、“最佳用户满意度奖”三项大奖,确立了在行业中的优势地位。2008年在由赛迪顾问、中国主机托管中心圈、中国数据中心产业发展调查组委会联合举办的主机托管数据中心年度评选中帝联荣获“2007年度优秀CDN平台奖”,综合实力跃居行业前列。
构建了国内最大的互联互通网络
电信通基于自身庞大的城域网和主机托管数据中心出口需求,电信通历经7年,构建了国内规模最大、品质最好、成本最低的互联互通网络和主机托管。电信通总出口带宽接近100G(用于CDN业务的300G主机托管数据中心带宽未计算在内),电信通与除中国移动外的所有国内运营商均建有对等互联。电信通在北京、天津、广州、武汉、上海、杭州、西安、青岛等骨干节点均建有2.5G以上的长途互联电路。电信通IP地址资源仅次于四大运营商、教育网及国家信息中心,名列全国第七。电信通在民营互联网服务商行列中,其网络资源无人所及。
作为中国铁通的战略伙伴,电信通依靠自身庞大的网络需求、良好的中立运营商身份,电信通发挥自身在互联互通领域丰富的市场与技术经验。电信通在铁通涉入互联网业务伊始,我们就协助铁通突破壁垒,实现了与电信和网通的低成本、高带宽的互联互通,电信通帮助铁通降低了75%的带宽成本(将对等连接的成本从2005年210万/G直降到了当前的50万/G),电信通为铁通提供了30%的高品质互联网出口带宽,促进了铁通互联网业务的高速发展。
电信通秉承“客户至上、服务至上”的经营理念,致力于为中国地区各行业的大中型企业、组织以及政府部门提供高标准、专业化、电信级的一站式主机托管数据中心服务,电信通为合作伙伴提供全面的互联互通技术支持和主机托管咨询服务,电信通使客户快速进入互联网领域并得以高速发展。
电信通愿与您携手共创互联网的未来。
北京电信通目前在北京拥有四个已建好自主产权的专业主机托管机房,分别是电信通惠普机房、电信通中关村机房、电信通三元桥机房、电信通海广机房。这四大机房的主机托管都在进行中。第五个机房雍和宫机房正在建设中。也将在2009年底开展主机托管业务。电信通在全国有30多个电信级合作机房,电信通立足北京为您提供一站式的全国的分布式IDC(主机托管)服务。
北京电信通是国内率先汇聚中国电信、中国网通、中国联通、中国移动、教育网等几大电信运营商网络资源的独立ISP运营商,拥有独立的自治域(AS),与各大电信运营商建立BGP连接,总出口带宽高达60多个G,拥有其他数据中心运营商无法比拟的带宽资源优势。电信通有效地解决了南北电信的互联互通问题,通过与各大运营商的多年合作,拥有稳定可靠的带宽品质,满足到不同运营商网络的访问需求,能满足各种用户对高品质网络的需要。
A)主机托管简介
北京电信通增值电信服务中心,利用其拥有的高速光纤线路,完备的网络环境、专业级的网络管理技术,为用户提供全面的主机托管解决方案。
北京电信通增值电信服务中心在设计上全面参考国际一流的互联网络数据中心标准。主机托管中心整体设计采用防静电地板、恒温恒湿系统、智能UPS整体电力供应系统及后备柴油发电机组。
电信通主机托管中心为了保证客户服务器在数据中心每天24小时、每周7天的安全运转,电信通主机托管中心提供独创的安全锁机笼式机架,配备24小时的录像监控系统、气体灭火系统,使用户安心无忧。
北京电信通数据增值电信服务中心将在带宽、空间、电力等方面给与贵公司以最好的服务和最优惠的价格。北京电信通数据增值电信服务中心可以为贵公司提供主机托管流量监控与管理服务,随时提供服务器访问使用的带宽情况,电信通根据贵公司的长期需求、发展方向及实际访问带宽,从最佳的性价比来分析,及时调整贵公司租用带宽容量进行主机托管。
B)主机托管机房环境和网络设备
电信通依据世界一流水准而建设的电信通数据北京综合解决方案中心,是我们信心的体现,也是您信心的保障。
主机托管建筑:电信通独有的楼宇控制系统、加固的防地震建筑物、高架承重的防静电地板。
主机托管网络环境:电信通电信级双路备份的网络设备、采用Cisco高端路由器和交换机、主干网络全冗余设计、电信通先进的网络管理和负载均衡系统、网络安全与防病毒一体化解决方案。
主机托管电力:电信通采用真正2路,不同电源供电,并设有柴油发电机作第三重保障。电信通机架的供电经过永远在线的UPS(不间断电源)设备的处理。电信通UPS为法国SOCOMEC产品,配置了N+1的冗余。
主机托管消防:电信通激光式烟感及温感探头组成的报警系统(日本NHOMI能美产品)、FM200环保型气体灭火系统。
主机托管空调:电信通全进口HIROSS计算机房级空调机、下送风上回风、恒温/恒湿/防尘,地板下配有防漏水感应系统。
主机托管网络监控中心(NOC):电信通24*7网络性能监控、24*7网络安全监控、流量监控和管理、电信通在异常情况的紧急响应和处理、应用程序的监控。
主机托管安全:电信通电视监控系统、多级智能认证保安系统、感应式门禁、掌纹识别。
主机托管呼叫中心:电信通配备完善的呼叫中心、提供客户服务和技术支持、专业水准的多语种操作人员、可答复电话/传真/电子邮件。
主机托管产品方案展示中心:电信通高科技尖端产品方案汇集、展示、交流的最佳场所。
惠普机房
机房地址:北京市朝阳区建国路112号惠普大厦2层
邮编
中关村机房
机房地址:北京市中关村南大街32号中关村科技发展大厦A座三层
邮编
三元桥机房
机房地址:北京市朝阳区西坝河东里18号三元大厦4层
邮编
苏州桥机房
机房地址:北京市万泉河路68号院紫金庄园10号楼
邮编
雍和宫机房(正在建设中)
地址:北京市东城区和平里东街11号航星3号楼5层
邮编
ISP互联网光纤接入
电信通已建设完成光缆皮长近5000公里,光纤接入在建光缆皮长2000公里,电信通规划施工3000公里,光纤接入总规模公里皮长;电信通网络接点超过300个;光纤接入网络遍布十八个区县。电信通在北京城区建有地下光纤城域网,电信通的光纤接入在北京城区所有范围内都已解决光纤路由问题。电信通光纤接入客户已遍布北京市商业区,成为北京市电信服务业最成功的接入商之一,电信通光纤接入合作方式及光纤接入服务质量为业界所称道。电信通汇聚中国电信、中国网通、中国联通、中国移动、教育网等几大电信运营商网络资源的独立ISP运营商,电信通拥有独立的自治域(AS),电信通与各大电信运营商建立BGP连接,总出口带宽高达60多个G,电信通拥有其他数据中心运营商无法比拟的光纤接入带宽资源优势。
光纤接入资源优势
A)电信通技术优势:电信通主干网络是一个全新的光纤接入网络,电信通具有下一代网络的光纤接入技术特征,不受传统网络的落后技术、网络结构的束膊,电信通采用目前国际上最前沿的、开放的光纤接入技术,保证网络在光纤接入通信领域的先进性。
B)电信通交换容量的优势:由于电信通网络采用了先进的光纤接入技术,保证传输容量巨大,设计光纤接入交换容量20Gbps。
C)电信通网络覆盖的优势:北京电信通公司在北京城区已建有光纤接入地下光纤城域网,电信通在北京城区范围内都已解决了光纤接入的光纤路由问题。电信通光纤城域网总长度大于2500千米。其中光纤接入环状光纤骨干链路长度约为100千米,包括5大节点:西单电报大楼、皂君庙机房、南银大厦、惠普大厦、厂甸机房。
D)电信通业务功能优势:电信通具有足够的光纤接入带宽,光纤接入可以实现高速上网、可视电话、IP电话、远程教育、远程医疗、住宅智能化等传统网络没办法做到的功能。
E)电信通南北互连互通的优势:电信通使用bgp协议拥有自己的AS号,电信通分别接入网通8G,电信12G很好的解决了光纤接入的南电信北网通互联互通中产生的光纤接入瓶颈问题。
丰富的运营经验
电信通光纤接入多年的专业化ISP行业运作,使北京电信通电信工程有限公司具备了运营大中型网络光纤接入的丰富经验,并且电信通在2001年北京ISP行业率先通过ISO9002光纤接入质量认证,电信通通过符合国际标准的质量维护体系更好地确保每一位光纤接入用户的服务质量。
电信通典型客户
政府部门:国务院新闻办公室、国务院新闻出版署、外交部、妇联、政协、劳动局、中央人民广播电台、人民日报社等。
证券业:北京证券、广发证券、湖南证券、银河证券、泰阳证券等。
外资企业:三星电子、松下电器、ABB、美国爱瑞斯通公司等。
ISP/ICP/IDC:中网通讯、互联通数据中心、嘉里数据中心、中经网、中国卫星通信广播总公司、计算机世界网、千龙网、中华美食网、网易等。
其他IT企业:亚信科技、中讯集团、方正集团、比特科技等。
电信通成功案例
北京电信通电信工程有限公司1999年成功实施了“政府上网工程”,电信通为22家国家部委及数百家国有大中型企业提供了全面的光纤接入和光纤接入技术服务。
2000年电信通为落实中国电信“企业上网工程”,与中关村科技园区管理委员会签订光纤接入战略合作协议,电信通光纤接入全面启动“数字园区”工程,为高新技术企业提供光纤接入网络服务。
与此同时,电信通启动了“数字CBD”工程,电信通建成了世界一流水平的光纤接入增值业务电信服务中心ITSC,电信通为北京商务中心区提供全面的光纤接入网络服务。
2004年电信通为实现北京2008标准化星级酒店,全面开始建设北京标准化酒店专用光纤接入网络体系。
2005年电信通在迎接北京2008年奥运会的大环境下,响应市政府的“四张网工程”北控电信通与北京市公安局合作成立了安保运营服务中心。电信通同时肩负了企业安防监控接入安保运营中心的工程。电信通凭借着光纤接入网路资源和强大光纤接入技术实力的支撑,电信通通过光纤接入将于2008年前实现5000个安防监控节点的接入,达到对北京市重点单位及场所进行实时监控,集中控制,达到群控群防。
驻地网服务
用户网络接口(UNI)到用户终端之间的相关网络设施。根据管理需要,在此,用户驻地网特指从用户驻地业务集中点到用户终端之间的相关网络设施。用户驻地可以是一个居民小区,也可以是一栋或相邻的多栋写字楼,但不包括城域范围内的接入网。我国驻地网通常是指楼内和小区产权范围内的接入网。我公司的驻地网业务,依托自身城域网资源优势和数据中心出口需求,历经七年的发展,在北京地区形成了无法比拟的规模优势,成为500多栋高档写字楼的接入合作伙伴。
我们的一些典型楼宇为:
朝外商圈:人寿大厦泛利大厦朝外MEN美惠大厦佳惠大厦中国工艺品大厦凯威大厦
三元桥、燕莎商圈:南银大厦京城大厦鹏润大厦发展大厦昆莎中心环球贸易中心
CBD商圈:华彬大厦远洋国际中心嘉里中心丰树大厦科伦大厦数码01大厦北京国际中心首开幸福广场嘉都大厦华腾大厦中国第一商城
金融街商圈:人寿中心月坛大厦通泰大厦投资广场建威大厦中化大厦
中关村、上地商圈:数码大厦银网中心太平洋国际大厦上地嘉华大厦锦秋大厦中关村科技发展大厦天作国际大厦财智国际大厦海泰大厦
紫竹院、白石桥商圈:牛顿中心腾达大厦金运大厦天行健大厦首钢国际大厦
北京电信通公司历史沿革
北京电信通公司系一家专业从事基于城域光纤网络基础设施的电信增值服务业务的公司,成立于2001年5月,注册资本为10,000万元。
公司设立初期,主要从事互联网专线接入业务,针对机关、企事业单位等高端客户的需求,提供互联网专线接入服务;在此基础上,通过几年来的滚动投资建设,逐步建成了覆盖北京城区的城域光纤网;同时,逐步开拓了电子政务、互联网数据中心(IDC)、专网构建及运营以及网络安全监控、城市监控、长话分流等网络增值服务业务。
目前,北京电信通拥有接近8,000公里的城域光纤网,城域网覆盖整个北京城区,是北京市主要的最后一公里网络运营商。北京市城区以机关、企事业单位为主的高端客户互联网专线接入市场的市场份额超过50%,网吧专线接入市场份额接近100%,互联网数据中心业务也占有较高的市场份额。
北京电信通现主要从事的业务包括:互联网专线接入,包括北京所有网吧的专线接入;城市安防监控网等专用网络的构建及运营;互联网数据中心等服务。
北京电信通设立八年来,得益于互联网业务迅猛发展的良好环境,以及业务拓展的努力,在北京市场上取得了不俗的市场地位,业务发展及盈利能力不断增强。
北京电信通的前身是北京电信通网络技术有限公司下属的互联网接入中心,2001年5月,该互联网接入中心被北京控股收购后,由北京控股下属的北京市京联发投资管理中心(以下简称京联发)联合北京市电信通经贸发展有限公司(以下简称电信通经贸)分别出资455万元、45万元设立北京电信通,初始注册资本500万元。
2002年9月和2003年12月,经两次现金增资和股权转让,北京电信通注册资本增加至1,000万元,京联发、北京昌泽网络技术咨询有限责任公司(以下简称昌泽)、北京市得利加自控技术有限公司(以下简称得利加)所持股权比例分别为63%、25%和12%。
2004年12月,京联发与北京电信通及其管理层达成协议,退出北京电信通,由管理层控制的北京通灵通电讯技术有限公司(以下简称通灵通)控股北京电信通;此后,昌泽亦将其所持北京电信通25%股权全部转让给通灵通。
2006年9月,为进一步完善公司完整业务链的资产结构、获得城市安防监控网络的建设资金,北京电信通进行增资。通灵通以中关村和惠普两个IDC机房的全部资产经评估作价8,000万元,深圳市瑞松投资有限公司(以下简称瑞松投资)、深圳市润星投资咨询有限公司(以下简称润星投资)以及得利加分别以现金4,225万元、2,565万元和600万元投入北京电信通,北京电信通注册资本增加至10,000万元。
股权转让及增资完成后,通灵通、瑞松投资、润星投资和得利加分别持有北京电信通52.80%、25.10%、14.90%和7.20%的股权。
现为成都鹏博士电信传媒集团股份有限公司控股
ASP.NET/C#中如何调用动态链接库DLL
动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式实现。
动态链接库是不能直接执行的,也不能接收消息,它只是一个独立的文件,其中包含能被程序或其它DLL调用来完成一定操作的函数(方法。
注:C#中一般称为“方法”),但这些函数不是执行程序本身的一部分,而是根据进程的需要按需载入,此时才能发挥作用。
DLL只有在应用程序需要时才被系统加载到进程的虚拟空间中,成为调用进程的一部分,此时该DLL也只能被该进程的线程访问,它的句柄可以被调用进程所使用,而调用进程的句柄也可以被该DLL所使用。
在内存中,一个DLL只有一个实例,且它的编制与具体的编程语言和编译器都没有关系,所以可以通过DLL来实现混合语言编程。
DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。
下面列出了当程序使用 DLL 时提供的一些优点:1)使用较少的资源当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量。
这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在 Windows 操作系统上运行的程序。
2)推广模块式体系结构DLL 有助于促进模块式程序的开发。
这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。
模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。
3)简化部署和安装当 DLL 中的函数需要更新或修复时,部署和安装 DLL 不要求重新建立程序与该 DLL 的链接。
此外,如果多个程序使用同一个 DLL,那么多个程序都将从该更新或修复中获益。
当您使用定期更新或修复的第三方 DLL 时,此问题可能会更频繁地出现。
每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍。
首先,您需要了解什么是托管,什么是非托管。
一般可以认为:非托管代码主要是基于win 32平台开发的DLL,activeX的组件,托管代码是基于平台开发的。
如果您想深入了解托管与非托管的关系与区别,及它们的运行机制,请您自行查找资料,本文件在此不作讨论。
(一)、调用DLL中的非托管函数一般方法首先,应该在C#语言源程序中声明外部方法,其基本形式是:[DLLImport(“DLL文件”)]修饰符 extern 返回变量类型 方法名称 (参数列表)其中:DLL文件:包含定义外部方法的库文件。
修饰符: 访问修饰符,除了abstract以外在声明方法时可以使用的修饰符。
返回变量类型:在DLL文件中你需调用方法的返回变量类型。
方法名称:在DLL文件中你需调用方法的名称。
参数列表:在DLL文件中你需调用方法的列表。
注意:需要在程序声明中使用命名空间。
DllImport只能放置在方法声明上。
DLL文件必须位于程序当前目录或系统定义的查询路径中(即:系统环境变量中Path所设置的路径)。
返回变量类型、方法名称、参数列表一定要与DLL文件中的定义相一致。
若要使用其它函数名,可以使用EntryPoint属性设置,如:[DllImport(, EntryPoint=MessageBoxA)]static extern int MsgBox(int hWnd, string msg, string caption, int type);其它可选的 DllImportAttribute 属性:阿CharSet 指示用在入口点中的字符集,如:CharSet=;SetLastError 指示方法是否保留 Win32上一错误,如:SetLastError=true;ExactSpelling 指示 EntryPoint 是否必须与指示的入口点的拼写完全匹配,如:ExactSpelling=false;PreserveSig指示方法的签名应当被保留还是被转换, 如:PreserveSig=true;CallingConvention指示入口点的调用约定, 如:CallingConvention=;此外,关于“数据封送处理”及“封送数字和逻辑标量”请参阅其它一些文章[2]。
C#例子:1.启动,新建一个项目,项目名称为“Tzb”,模板为“Windows 应用程序”。
2.在“工具箱”的“ Windows 窗体”项中双击“Button”项,向“Form1”窗体中添加一个按钮。
3.改变按钮的属性:Name为 “B1”,Text为 “用DllImport调用DLL弹出提示框”,并将按钮B1调整到适当大小,移到适当位置。
4.在类视图中双击“Form1”,打开“Form1.cs”代码视图,在“namespace Tzb”上面输入“using ;”,以导入该命名空间。
5.在“Form1.cs[设计]”视图中双击按钮B1,在“B1_Click”方法上面使用关键字 static 和 extern 声明方法“MsgBox”,将 DllImport 属性附加到该方法,这里我们要使用的是“user32.dll”中的“MessageBoxA”函数,具体代码如下:[DllImport(, EntryPoint=MessageBoxA)]static extern int MsgBox(int hWnd, string msg, string caption, int type);然后在“B1_Click”方法体内添加如下代码,以调用方法“MsgBox”:MsgBox(0, 这就是用 DllImport 调用 DLL 弹出的提示框哦! , 挑战杯 ,0x30);6.按“F5”运行该程序,并点击按钮B1,便弹出如下提示框:7.代码如下:using System;using ;using ;using ;using ;using ;using ;using ;using ;namespace WindowsFormsApplication1{ public partial class Form1 : Form { [DllImport(, EntryPoint = MessageBoxA)] static extern int MsgBox2(int hWnd, string msg, string caption, int type); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { MsgBox2(0, 这就是用 DllImport 调用 DLL 弹出的提示框哦! , 挑战杯 , 0x30); } private void button2_Click(object sender, EventArgs e) { MsgBox2(0, 这就是用 DllImport 调用 DLL 弹出的提示框哦f! , , 0x30); } }}(二) 动态装载、调用DLL中的非托管函数在上面已经说明了如何用DllImport调用DLL中的非托管函数,但是这个是全局的函数,假若DLL中的非托管函数有一个静态变量S,每次调用这个函数的时候,静态变量S就自动加1。
结果,当需要重新计数时,就不能得出想要的结果。
下面将用例子说明:1. DLL的创建1)、启动Visual C++ 6.0;2)、新建一个“Win32 Dynamic-Link Library”工程,工程名称为“Count”;3)、在“Dll kind”选择界面中选择“A simple dll project”;4)、打开,添加如下代码:// 导出函数,使用“ _stdcall ” 标准调用extern C _declspec(dllexport)int _stdcall count(int init);int _stdcall count(int init){//count 函数,使用参数 init 初始化静态的整形变量 S ,并使 S 自加 1 后返回该值static int S=init;S++;return S;}5)、按“F7”进行编译,得到(在工程目录下的Debug文件夹中)。
2. 用DllImport调用DLL中的count函数1)、打开项目“Tzb”,向“Form1”窗体中添加一个按钮。
2)、改变按钮的属性:Name为 “B2”,Text为 “用DllImport调用DLL中count函数”,并将按钮B1调整到适当大小,移到适当位置。
3)、打开“Form1.cs”代码视图,使用关键字 static 和 extern 声明方法“count”,并使其具有来自 的导出函数count的实现,代码如下:[DllImport()]static extern int count(int init);4)、 在“Form1.cs[设计]”视图中双击按钮B2,在“B2_Click”方法体内添加如下代码( 用 DllImport 调用 DLL 中的 count 函数, n 传入的实参为 0 ,得到的结果是: +count(0)(), 挑战杯 );( 用 DllImport 调用 DLL 中的 count 函数, n 传入的实参为 10 ,得到的结果是: +count(10)()+n 结果可不是想要的 11 哦!!! , 挑战杯 );( 所得结果表明: n 用 DllImport 调用 DLL 中的非托管 n 函数是全局的、静态的函数!!! , 挑战杯 );5)、把复制到项目“Tzb”的binDebug文件夹中,按“F5”运行该程序,并点击按钮B2,便弹出如下三个提示框:第1个提示框显示的是调用“count(0)”的结果,第2个提示框显示的是调用“count(10)”的结果,由所得结果可以证明“用DllImport调用DLL中的非托管函数是全局的、静态的函数”。
所以,有时候并不能达到我们目的,因此我们需要使用下面所介绍的方法:C#动态调用DLL中的函数。
3.C#动态调用DLL中的函数因为C#中使用DllImport是不能像动态load/unload assembly那样,所以只能借助API函数了。
在中,与动态库调用有关的函数包括:①LoadLibrary(或MFC 的AfxLoadLibrary),装载动态库。
②GetProcAddress,获取要引入的函数,将符号名或标识号转换为DLL内部地址。
③FreeLibrary(或MFC的AfxFreeLibrary),释放动态链接库。
它们的原型分别是:HMODULE LoadLibrary(LPCTSTR lpFileName);FARPROC GetProcAddress(HMODULE hModule, LPCWSTR lpProcName);BOOL FreeLibrary(HMODULE hModule);现在,我们可以用IntPtr hModule=LoadLibrary(“”);来获得Dll的句柄,用IntPtr farProc=GetProcAddress(hModule,”_count@4”);来获得函数的入口地址。
但是,知道函数的入口地址后,怎样调用这个函数呢?因为在C#中是没有函数指针的,没有像C++那样的函数指针调用方式来调用函数,所以我们得借助其它方法。
经过研究,发现我们可以通过结合使用及里的类和函数达到我们的目的。
为了以后使用方便及实现代码的复用,我们可以编写一个类。
1)、 dld类的编写:1.打开项目“Tzb”,打开类视图,右击“Tzb”,选择“添加”-->“类”,类名设置为“dld”,即dynamic loading dll 的每个单词的开头字母。
2.添加所需的命名空间及声明参数传递方式枚举:using ; // 用 DllImport 需用此 命名空间using ; // 使用 Assembly 类需用此 命名空间using ; // 使用 ILGenerator 需用此 命名空间在“public class dld”上面添加如下代码声明参数传递方式枚举:/// <summary>/// 参数传递方式枚举 ,ByValue 表示值传递 ,ByRef 表示址传递/// </summary>public enum ModePass{ByValue = 0x0001,ByRef = 0x0002}3.声明LoadLibrary、GetProcAddress、FreeLibrary及私有变量hModule和farProc:/// <summary>/// 原型是 :HMODULE LoadLibrary(LPCTSTR lpFileName);/// </summary>/// <param>DLL 文件名 </param>/// <returns> 函数库模块的句柄 </returns>[DllImport()]static extern IntPtr LoadLibrary(string lpFileName);/// <summary>/// 原型是 : FARPROC GetProcAddress(HMODULE hModule, LPCWSTR lpProcName);/// </summary>/// <param> 包含需调用函数的函数库模块的句柄 </param>/// <param> 调用函数的名称 </param>/// <returns> 函数指针 </returns>[DllImport()]static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);/// <summary>/// 原型是 : BOOL FreeLibrary(HMODULE hModule);/// </summary>/// <param> 需释放的函数库模块的句柄 </param>/// <returns> 是否已释放指定的 Dll</returns>[DllImport(kernel32,EntryPoint=FreeLibrary,SetLastError=true)]static extern bool FreeLibrary(IntPtr hModule);/// <summary>/// Loadlibrary 返回的函数库模块的句柄/// </summary>private IntPtr hModule=;/// <summary>/// GetProcAddress 返回的函数指针/// </summary>private IntPtr farProc=;4.添加LoadDll方法,并为了调用时方便,重载了这个方法:/// <summary>/// 装载 Dll/// </summary>/// <param>DLL 文件名 </param>public void LoadDll(string lpFileName){hModule=LoadLibrary(lpFileName);if(hModule==)throw(new Exception( 没有找到 :+lpFileName+. ));} 若已有已装载Dll的句柄,可以使用LoadDll方法的第二个版本:public void LoadDll(IntPtr HMODULE){if(HMODULE==)throw(new Exception( 所传入的函数库模块的句柄 HMODULE 为空 . ));hModule=HMODULE;}5.添加LoadFun方法,并为了调用时方便,也重载了这个方法,方法的具体代码及注释如下:/// <summary>/// 获得函数指针/// </summary>/// <param> 调用函数的名称 </param>public void LoadFun(string lpProcName){ // 若函数库模块的句柄为空,则抛出异常if(hModule==)throw(new Exception( 函数库模块的句柄为空 , 请确保已进行 LoadDll 操作 !));// 取得函数指针farProc = GetProcAddress(hModule,lpProcName);// 若函数指针,则抛出异常if(farProc==)throw(new Exception( 没有找到 :+lpProcName+ 这个函数的入口点 ));}/// <summary>/// 获得函数指针/// </summary>/// <param> 包含需调用函数的 DLL 文件名 </param>/// <param> 调用函数的名称 </param>public void LoadFun(string lpFileName,string lpProcName){ // 取得函数库模块的句柄hModule=LoadLibrary(lpFileName);// 若函数库模块的句柄为空,则抛出异常if(hModule==)throw(new Exception( 没有找到 :+lpFileName+. ));// 取得函数指针farProc = GetProcAddress(hModule,lpProcName);// 若函数指针,则抛出异常if(farProc==)throw(new Exception( 没有找到 :+lpProcName+ 这个函数的入口点 ));}6.添加UnLoadDll及Invoke方法,Invoke方法也进行了重载:/// <summary>/// 卸载 Dll/// </summary>public void UnLoadDll(){FreeLibrary(hModule);hModule=;farProc=;}