c#中using-添加引用-程序集(详解) 以及与 c++中include等区别

C++前置声明还是include?彻底搞懂incomplete type报错与头文件优化 C++的编译模型基于文本包含和单遍解析,编译器必须随时掌握类型的完整信息。前置声明只提供类型名称,而不完整类型无法确定内存布局和析构行为,导致常见的'field has incomplete type'等编译错误。了解完整类型与不完整类型的边界,是优化头文件依赖、加速编译的关键。在实际工程中,合理使用前置声明可以打破循环包含并减少无效依赖,而按值成员、继承、unique_ptr析构、标准库容器销毁等场景则必须include完整定义。Pimpl惯用法正是利用这一原理,将析构时机移至源文件,实现接口隐藏与编译加 阅读详情

一、c#中Using无非就三个作用,引入名字空间,减少代码输入量;给名字空间或类型定义一个别名;try-catch的一种替代。

二、c#中添加引用的作用是把其它程序集包含到本项目中,就好像在本项目中写的类一样,因为只有在一个项目中写的类才能互相识别。c#中一个项目中写的两个类是无条件相互识别的,比如在项目中写了Class1和Class2,当然这两个类的名字空间一样。在Class2的方法中可以直接定义Class1的实例(甚至输入代码过程中有智能提示)。我理解,在书写代码的过程中,每定义一个名称,这个名称(不管是类名,方法名还是属性名)一直在随着分号的结束自动添加到自己所在的程序集中的。

三、要区分using和添加引用功能并内有任何必然联系。添加引用有点相当于c++中的include,是把别的程序集中定义的类的信息让本项目识别(因此添加完引用后就有可能出现只能提示)。using表示使用了某个名字空间,完全可以从来不用using来引入名字空间,使用某个程序集中的类型时使用包含名字空间的全名,只不过这样书写起代码太麻烦。所以using引入名字空间完全是为了书写代码方便,而添加引用是为了将别人写的类导入到自己的项目中来(就好像增加了一个新写的类一样)使用。

四、c++中也有using名字空间语句,它的名字空间和c#中的名字空间完全一样,只是为了避免重名而已。C++中的include语句只起到将某些代码原样复制到所在位置。我理解由于c++不想c#中那样有程序集的概念,不会在书写代码的过程中自动把定义的类型添加到程序集中,所以书写的各个类(不同的.cpp源文件)互相不识别,需要通过include来提前声明一个表示这个类型已经定义过了(和函数声明一样),可以在其它源文件中找到。

五、我总结,C#中没有“使用前先声明”这样的说法,只有“使用前必须在程序集中能找到”这样的说法,只要存在程序集中就有智能提示。而C++中必须遵循“使用前先声明”这样的说法,只要声明过来就有智能提示。之所以这样,可能是因为C#的源代码纯是由一个个类组成的,便于组织成程序集单元。而C++中的源代码灵活性太高,不易组成固定格式的程序集或者因为历史原因没用程序集这样的概念,所以有了两者对于“先声明后使用”的区别对待。

六、补充下C#中程序集的概念:

程序集(Assembly)是组织程序的逻辑单元,我们编写好的代码最终都会被编译器编译为若干个程序集。需要指出的是程序集只是逻辑上的划分,一个程序集可以只由一个文件组成,也可以由多个文件组成。单文件程序集的所有内容都存放在一个文件中,是最简单也是最常用的类型;多文件程序集则把它的内容分别放在多个文件中。最常见的两种程序集在物理上体现为exe文件和dll文件。

程序集由程序集元数据、类型元数据、MSIL代码和资源四部分组成(这几个部分可能在不同的物理文件中),如下图

 

1、其中,程序集元数据也叫“清单”【估计为了版本控制等作用】,它记录了程序集的许多重要信息,是程序集进行自我说明的核心文档。当程序运行时,CLR仅通过这份清单就能获取运行程序集所必需的全部信息。清单主要包括如下信息:

(1)标识信息(包括程序集的名称、版本、文化和公钥等)

(2)文件列表(程序集由哪些文件组成)

(3)引用程序集列表(该程序集所引用的其它程序集)

(4)一组许可要求(运行这个程序集需要的许可)

注意:我把“引用的程序集列表加粗显示”是因为,这点很重要,因为真是因为有这个因素,比如我们在主程序集main.exe中引用了A程序集a.dll,而a.dll又引入了b.dll。那么我们在添加A程序集的引用a.dll后还需不需要添加b.dll呢?原来我一直以为需要,实际上是对程序集理解错误了,不要把程序集单纯的理解就和一个cs代码文件一样,他其实是一个比cs内容更丰富的东西。实际上运行时,main.exe先加载入内存,同时分析main.exe还包括引用了哪些其他程序集,发现引用了a.dll,所以main.exe加载入内存后又紧接着加载a.dll进入内存,又分析a.dll发现引用了b.dll,紧接着又加载b.dll进入内存,但经过测试发现如果没有发现a.dll或b.dll则在程序刚开始运行时不一定出错,只有当使用到对应dll中的东西时才提示“未能加载程序集或程序集版本号不匹配之类的错误”。(有点静态链接的意思,在运行初始阶段就把所有需要的库都加载进入内存了,只不过c++的静态链接库全部被写入到了exe中,c#中没有把dll写入exe中而已。当然要实现类似动态链接那样用到那个库时才加载对应的dll则在C#中可以使用反射机制。)

另外,程序引用中的第三方控件的版本号(我这边是路径导致的)和最终生成的程序集清单所需的版本号并不相符的问题?

   .net的CLR在执行一个程序时(如.exe)时或使用一个.dll时,他会首先查看其程序集(.exe或.dll)的程序集清单,找到运行该程序所引用的程序集并加载。.net会按一定的路径搜索,加载.若加载的版本和程序清单中的不一致时就会出现类似"程序集清单定义与程序集引用不匹配"报错。【这说明程序集列表还含有版本信息,不光只有名称】

【另外,对于上面的情况,如果b.dll位于全局程序集缓存GAC中则这个b.dll并不写入到引用程序集列表中,所以不能简单的把这些dll复制到exe的输出目录中然后拷贝到其他机器上运行,因为运行时即使b.dll存在bin目录中,但仍然不载入内存,如果其他机子的GAC中没有b.dll的话就会提示缺少b.dll的错误,我在引入oracle.dataaccess.dll的时候就出现这个情况】

关于添加引用的方法和问题详见:http://msdn.microsoft.com/zh-cn/library/windows/hardware/ez524kew(v=vs.90)

 

2、类型元数据列举了程序集中包含的类型信息【比如帮助实现了书写代码时的智能提示等作用】,详细说明了程序集中定义了哪些类,每个类包含了哪些属性和函数,每个函数有哪些参数和返回值类型,等等。

 

3、MSIL是程序集中真正在运行时使用的东西,也是核心(也就是我们写的真正的代码)。也就是我们写的代码真正在运行中的体现。相比之下“列表”和类型元数据只不过是.NET帮我们自动生成的辅助信息,只不过为了运行前的一些工作便利罢了。

 

4、资源包括图像、图标、声音等资源。

 

总之,程序集是自我说明的【通过元数据这种辅助信息】,这些自我说明文档提供了运行程序集所必须的信息,这样我们就不必依靠注册表等外部信息就能运行程序。所有的信息存于一处,这种设计方式也大大简化了程序的安装过程。

需要澄清的是,命名空间与程序集并不总是一一对应的。命名空间是类名的扩展,一个程序集可以包含多个命名空间,一个命名空间也可以分布在多个程序集中。

C#开发者转C++必知的五大核心差异与避坑指南 C++与C#虽语法相似,但底层模型截然不同:C#依托托管运行时与GC实现自动内存管理,而C++要求开发者直面栈/堆分配、RAII资源生命周期、值语义拷贝、字符串编码及ABI兼容性等硬性约束。理解指针与引用的本质差异、std::string与System.String的编码鸿沟、异常与错误码的混合使用范式,是避免悬空指针、内存泄漏、乱码崩溃的关键。尤其在跨平台开发、Unity Native Plugin、高频交易系统等场景中,C#到C++迁移本质是编程心智模型的重构——从依赖运行时保障转向对字节、作用域与编译 阅读详情

相关推荐

告别托管依赖:用.NET 8的Native AOT把C#库打包成纯原生DLL,让C++项目无缝调用

本文详细介绍了如何利用.NET 8的Native AOT技术将C#库编译为纯原生DLL,实现C++项目的无缝调用。通过实战案例和性能对比,展示了Native AOT在消除托管依赖、提升执行效率方面的显著优势,特别适合游戏开发、工业控制等高性能场景。

weixin_33725722的博客 153

c# 添加 引用的方法

win7 64位 pc vs2013c# 添加 引用的方法

abc 1万+

C#【必备技能篇】程序集间的引用

两个程序集:ConsoleApp1和ConsoleApp2 说明:程序集ConsoleApp2中的类继承程序集ConsoleApp1中的类 ConsoleApp1生成ConsoleApp1.dll的操作过程: 右键属性——>输出类型选择“类库”——>右键ConsoleApp1选择“作为启动项”——>运行生成ConsoleApp1.dll ConsoleApp1的代码: ConsoleApp2的代码: ConsoleApp2引用ConsoleApp1.dll: 选择ConsoleApp2为启

星Yeah 的博客 2931

c#语言 添加引用,C#中加载dll并调用其函数的实现方法

C#编程中,调用封装dll中的函数是高频使用的。那么,如何在程序中加载dll并调用其中的函数呢?更进一步的,如何在主程序中对自己封装的dll中的函数进行调试呢?加载dll-添加引用添加引用的意思是让程序生成时根据配置的路径去加载相应的dll。其引用的步骤如下图所示:解决方案->引用-> 添加引用-> 浏览-> 选择dll所在的路径->确定导入命名空间、实例化对象、调用...

weixin_32239523的博客 6109

EtherCAT简介

EtherCAT(EtherNet Control Automation Technology)是由德国公司BECKHOFF公司于2003年提出的实时工业以太网技术。其具有高速、高数据有效率的特点,支持多种设备的连接拓扑结构。从站节点使用专用的控制芯片,例如:microchip公司的Lan9252、BECKHOFF公司的ET1100等ESC(EtherCAT slave controller)芯片。主站的搭建方式有很多,例如:开源主站IGH、SOEM、商业化主站TwinCAT等。

m0_73482095的博客 1万+

别再死记硬背了!用51单片机的AD/DA和PWM,亲手做个简易示波器信号发生器

本文详细介绍了如何利用51单片机的PWM和AD/DA功能制作简易示波器信号发生器。通过PWM模拟DAC输出波形,结合XPT2046 ADC进行信号测量,实现方波、三角波和正弦波的生成与显示。项目不仅成本低廉,还能帮助电子爱好者深入理解51单片机的核心功能,是理论与实践结合的绝佳案例。

weixin_28675839的博客 265

C# 应用程序结构(程序集, 对象, 成员), 引用程序集与访问限制

C# 应用程序结构(程序集, 对象, 成员), 引用程序集与访问限制

JaydenCheng的博客 1656

工程制图习题集张大庆课后习题答案解析

所以,我想向大家求助,希望能得到一些学习资料、学习方法和学习经验,帮助我更好地理解和掌握这门课程。在寻找学习资料的过程中,我发现了一款叫做资小料的APP,它里面有很多关于工程制图的学习资料,包括视频教程、习题解答和考试真题等。通过使用资小料,我逐渐掌握了工程制图的基本理论和方法,解决了很多学习中遇到的问题。在这里,我想推荐给和我一样在学习《工程制图习题集》这门课的同学们,希望大家也能从这款APP中受益,共同进步。上传者: 『Consentesdei』蒼迷穀。出版社: 清华大学出版社。

weixin_58833001的博客 925

C#如何添加/删除引用

首先声明,我是初学者,希望此文对初学者有用。添加引用的方法是:在Visual Studio 中点击菜单“项目->添加引用”,在弹出的对话框中选择“”选项卡,在其中找需要添加的命名空间,选择并确定。删除引用的方法是:在Visual Studio 中点击菜单“视图->解决方案资源管理器”,在其中展开“引用”文件夹,在欲删除的引用上右击鼠标,点击“移除”即可。

ljg888的专栏 2万+

QMT实盘避坑指南:从环境配置到策略部署的完整流程(含国金证券路径设置)

本文是一份详尽的QMT实盘交易避坑指南,重点解析了从环境配置到策略部署的完整流程。针对国金证券QMT平台,文章深入剖析了核心架构、精准路径配置、关键参数解析、交易操作实战及异常处理,并提供了策略部署、监控与日志构建的完整方案,旨在帮助具备Python基础的开发者规避常见陷阱,实现稳定可靠的实盘交易。

weixin_29309475的博客 590

解锁PyCharm+Deepseek:本地部署AI编程超能力

在本次探索中,我们成功地在 PyCharm 中实现了 DeepSeek 的本地化部署,这一过程虽然涉及多个步骤,但每一步都为我们开启 AI 编程大门奠定了基础。从安装最新版 PyCharm,确保我们拥有一个功能强大且兼容性良好的开发环境,到注册 DeepSeek 账号并获取 API Key,这是连接我们与强大 AI 能力的关键纽带。接着,在 PyCharm 中安装 Continue 插件并进行精细配置,让 DeepSeek 能够深度融入我们的编程流程。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 5548

using namespace 和 include 区别

include是用于添加文件,而using namespace用于保持代码简洁帮你少些代码的,并将其打包在“有意义”的库中。如果不需要引用很多库或者定义重名变量或函数,可以省略using namespace,但绝对需要使用#include。

jshxjd的博客 538

向华为学习——IPD流程体系之IPD术语

《IPD体系核心概念与业务术语解析》摘要: IPD(集成产品开发)是一种以市场为导向的结构化产品开发管理模式,通过跨部门协作、异步开发、CBB(通用构建模块)和管道管理等手段,实现产品全生命周期高效管理。体系包含七大核心要素:跨部门团队(如IPMT决策层、PDT执行层)、结构化流程(分阶段评审)、端到端项目管理(WBS分级计划)、客户需求分析、投资组合优化及质量管控(TR技术评审)。各业务领域术语涵盖财务(NPV、IRR)、开发(需求分解、基线化)、制造(可制造性设计)、采购(Sourcing团队)及市场(

cdfunlove的博客 480

【C++ 】C++ 与 C#:using 关键字、命名空间及作用域解析符对比

本文对比了C++和C#在命名空间、using关键字及作用域运算符的差异。C++支持整包引入、单名引入和类型别名,而C#仅支持整包引入和静态导入;C++命名空间可包含变量、函数和类型,C#只能包含类型;C++使用::访问全局作用域,C#用.且必须前缀。迁移口诀总结了主要区别:C#需将变量和函数封装进类,用.替代::,且不支持单名引入。文末指出C++的using别名在模板实例化阶段仍可见,而C#的会被擦除。

songhuangong123的博客 360

置顶必读(1) |《滚雪球学 Spring Boot 4.x》专栏目录导航篇(持续更新中)!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 8万+

DW3000芯片驱动API介绍

详细介绍DW3000驱动程序API的调用流程说明和中断处理程序流程说明

DT程序员的博客 1519

注意C++和C#引用的区别

C#用多了,最近又回到C++编程。发现有些致命的区别,如果不注意,很可能导致一些莫名其妙的bug。引用类型就是其中一个。 在C#中,引用跟指针比较接近,除了值类型(int, float, struct等),其它类型都是引用类型。它本身是一个栈上面的变量,指向堆上面的具体实例,可以随意更改它指向的实例。 而在C++中,引用是变量的一个别名而已,它需要在初始化时指向一个实例,之后对它的操作就相当于...

weixin_34279061的博客 177

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

用VS开发者命令提示符查看C++类内存布局与C#程序集元数据

在C++和C#开发中,类的内部结构往往被IDE隐藏,而理解编译器视角下的类布局是排查内存膨胀、ABI兼容性问题和虚函数机制的关键。C++类在编译后并不保留类型信息,其内存布局包括成员偏移、对齐填充和虚表指针位置,都需要通过编译器输出才能精确查看;C#类则以CLI元数据和IL代码形式保存在程序集中。利用Visual Studio开发者命令提示符中的cl.exe /d1开关,可以快速导出C++类的布局信息,直观看到虚表指针、成员变量顺序对对象大小的影响。而dumpbin和ildasm则分别用于查看DLL导出符号

weixin_30082367的博客 90

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C#,C++,Java三者的一些区别

一、关于声明和定义 在c++中一定要严格区分声明(不分配内存但在obj符号表中登记)和定义(分配内存)的区别,而在c#和java中我认为可以不用区分,就当没有声明这个概念,只有定义这个概念。原因是c++中的cpp文件都是要分别独立编译的,所以编译某个cpp时,是根本看不到其它cpp中有什么内容的,所以如果用到其它cpp中的符号(如变量),这些符号必须在这个要编译的cpp中声明,表示这个符号是“自

Kirilenko_ 819

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

imports,using,和include之间的区别

Imports,Using基本一样,有两个作用 1、将后面命名空间中所有的名字导入到当前命名空间 2、为后面的名字取一个当前命名空间可以访问的别名。 比如StreamWriter这个类在System.IO命名空间,用的时候得写System.IO.StreamWriter才能找到,这通常太麻烦,因此只要写ImportsSystem.IO,就会把所有System.IO下面的名字,包括StreamW...

weixin_30617695的博客 114

C#开发心得

IR(中间语言)等价于java的字节码。CLR(公共语言运行时)等价于JVM,用来执行IR。运行在.NET上的C#/F#/VB.NET/IronPython等语言都可以编译为IR,彼此互操作,就像JVM上kotlin/scala通过字节码与java语言互操作类似。

tlxamulet的博客 558

C++与C#对比学习:预编译与编译机制(二)

常用预处理指令   C++中常用预处理指令 前面讲了主要有四种1.include引用头文件 2.条件编译#define  #ifdef等  3.#define定义宏  4.progma   1.include引用头文件 我们经常会看到#include "ABC.h" 和#include 这样的写法. "ABC.h"这样带个h的预编译时直接在当前项目目录上去找.而这样的是去系统目录中.那

weiwenhp 3307

c include 多层目录_干货:构建C/C++良好的工程结构

C++20通过了一项非常重要的特性:提供import机制。使用import来引用某个导出的库,而不是基于源代码展开的#include来引用头文件,有助于写出更直观的代码,减少编译时间。都9102年了,要知道在很多年前,C#,Java就支持了这个特性,如C#,以Assembly(程序集)的形式来管理模块,而C语言,C++,从诞生开始到现在仍然在用最原始的#include,真是让人头大。 那么,...

weixin_33173126的博客 985

用Visual Studio开发者命令提示符查看C++类布局与符号

C++类的内存布局由编译器根据对齐规则、虚函数表指针和继承关系最终决定,而这些底层细节在IDE类视图中往往难以直接看到。MSVC编译器提供的/d1reportSingleClassLayout诊断参数可以在命令行强制输出类的大小、成员偏移、虚表位置等精确信息,帮助开发者快速定位内存对齐、跨模块成员错位或多态布局问题。Visual Studio自带的开发者命令提示符则整合了cl、dumpbin、ILDASM等工具链,让开发者无需手动配置环境变量即可直接查看C++类布局、DLL导出符号以及.NET程序集元数据。

weixin_34379433的博客 421
上一篇: 引用的本质是什么(c++,c#,java)?
下一篇: 静态函数 抽象类 覆盖-重写-重载 委托-事件-匿名函数 密封 Lambda表达式
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值