O'Reilly - .NET Framework Essentials, 2nd Edition--第二章

CLR: manage and execute code written in .NET languages and is the basis of the .NET architecture.

2.1 CLR Environment  
How does the CLR work?      
CLR is the runtime engine that loads required classes, performs just-in-time complication on needed methods, enforces security checks, and accomplishes a bunch of other runtime functionalities.  
2.2 CLR Executables  .NET executables:
They carry not only code and data, but also metadata ----------VS-------  Typical windows executables: only code and data  The format of one .NET PE File 
  
 2.3 Metadata:
是机器可以识别的关于源文件的信息,或者可以翻译成“关于数据的数据”。 在.NET中,元数据包括:定义类型、版本信息、内部组件资料、以及其他标准化信息。 在.NET中,元数据就是在COM中的Type Library
元数据的作用
CLR CLR uses metadata for verification, security enforcement, cross-context marshaling, memory layout, and execution
Class Loader The Class Loader uses metadata to find and load .NET classes
JIT Complier JIT complier use metadata to compile Microsoft Intermediate Language(IL) code
Tools Tools use metadata to support integration.

2.3.3 Examine the metadata by a tool named ildasm.exe 2.3.3 Inspecting and Emitting Metadata       
System. Reflection Reflection API: Use those collectively classes to load and      insoect a .NET assembly to determine what types it supports.
System.Reflection.Emit
2.3.4 Interoperability Support
    Introduce 4 tools: the .NET assembly registration utility (RegAsm.exe); the type library exporter (tlbexp.exe); the type library importer (tlbimp.exe); the XML schema definition tool (xsd.exe)
RegAsm.exe To register a .NET assembly into the registry so COM clients can make use of it
tlbexp.exe Generate a type library file (.tlb) when you pass it a .NET assembly
tlbimp.exe Make a .NET assembly look like a COM component
xsd.exe 1 To convert an XML schema into a C# class, and vice versa. 2 can also take a .NET assembly and generate an XML schema definition (XSD) that represents the types within the .NET assembly
 
2.4 Assemblies and Manifests
       Assemblies: deployable units
       Manifests: the metadata that describes the assemblies
      Difference of the two definition: an assemble is a logic DLL or EXE, and a manifest is a detail description (metadata) of an assembly, including its version, what other assemblies it uses, and so on.
   2.4.1 Assemblies versus Components

       在COM时代, 微软的文档中经常出现 component , 有时指a COM Class , 有时指a COM module (DLL或EXE), 迫使读者或开发人员在遇见她的时候去根据上下文去理解是哪个意思. 在..NET中通过引入assembly这个新词来区别这个混淆.
       Assembly: a software component that supports plug-and-play, much like a hardware component. Theoretically, a .NET assembly is approximately equivalent to a COM module, In practice, an assembly can contain or refer to a number of types and physical files (including bitmap files, .NET PE files, and so forth) that are needed at runtime for successful execution. In addition to hosting IL code, an assembly is a basic unit of versioning, deployment, security management, side-by-side execution, sharing, and reuse.  
2.4.2 Unique Identities
        In COM: Given the number of GUID In COM, development and deployment can be tedious because you must use these magic numbers in your code and elsewhere all the time.
       In .NET: you refer to a specific type by its readable name and its namespace. Since a .NET readable name and its namespace are not enough to be globally unique, .NET guarantees uniqueness by using unique public/private key pairs. All assemblies that are shared by multiple applications must be built with a public/private key pair. Public/private key pairs are used in public-key cryptography. Since public-key cryptography uses asymmetric encryption, an assembly creator can sign an assembly with a private key, and anyone can verify that digital signature using the assembly creator’s public key.

 


  2.4.3 IL Code
  2.4.4 Versioning
           1 Static assemblies
              2 Dynamic assemblies
              3 Private assemblies
              4 Public or Shared assemblies
 2.4.5 Deployment: you have no longer to use registry to store activation and marshaling hints as in COM
  2.4.6 Security: an assembly itself has a code identity, which includes information such as the assembly’s shared name, version number, culture, and public key. Using this concept, the CLR cam verify whether an assembly is permitted to access system resources or make calls to other assemblies
 2.4.7 Side-by-Side Execution
              Side-by-side execution: the CLR allows any versions of the same, shared DLL to execute at the same time, on the same system, and even in the same oricess.
              MS .NET accomplishes side-by-side execution by using the versioning and deployment features that are innate to all shared assemblies. This concept allows you to install ant versions of the same, shared assembly on the same machine, without versioning conflicts or DLL Hell. The only caveat is that your assemblies must be public or shared assemblies, meaning that you must register them against the GAC using a tool such as the .NET Global Assembly Cache Utility. Once you have registered different versions of the same shared assembly into the AC, the human-readable name of the assembly no longer matters—what’s important is the information provided by .Net’s versioning and deployment features.
              Recall: the shared assembly’s version information + 8-byte hash of the shared assembly’s public key. Use the two information, the CLR can find the exact shared assembly that your application uses, and it will even verify that your 8-byte hash is indeed equivalent to that of the shared assembly.
  2.4.8 Sharing and Reuse  
       when you want to share your assembly with others, your assembly must have a shared or strong name, and you must register in the GAC.
  2.4.9 Manifests: Assembly Metadata
  an assembly manifests is metadata that describes everything about the assembly, including its identity, a list of files belonging to the assembly, references to external assemblies, exported types, exported resources, and permission requests. In short, it describes all the details that are required for component plug-and-play.

Use a class

In COM

In .NET

1 the COM library looks up in the registry to find the COM  component that exposes that class.
2 loads the component
3 tell the component to give it an instance of that class
4 return a reference to this instance

1 CLR peers right into the assembly manifest
2 determines which external assembly is needed
3 loads the exact assembly that’s required by your application
4 creates an instance of the target class

2.4.10 Creating Assemblies
you can create a single-module assembly or a multi-module assembly.
a single-module assembly: everything in a build is clumped into one exe or dll, which is easy created because a complier takes care of creating the single-module assembly for you.
a multi-module assembly, one that contains many modules and resource files, you have a few choices. One option is to use the Assembly Linker (al.exe). this tool takes one or more IL or resource files and spits out a file with an assembly manifest, also, we can use visual studio

2.4.11 Using Assemblies
To use an assembly, first import the assembly into your code, the syntax of which is dependent upon the language that you use. In c#, there is a simple
    using system;
when you build you application, you must tell the complier that you are referencing an external assembly.
2.5 Intermediate Language (IL)
Abstraction: we often use abstraction to hide the complexity of system or application services, providing instead a simple interface to the consumer. As long as we can keep the interface the same, we can change the hideous internals, and different consumers can use the same interface.
In language advances, scientists introduced different incarnations of language-abstraction layers, such as p-code and bytecode.
Produced by the Pascal-P complier, p-code is an intermediate language that supports procedural programming.
Generated by Java compliers, bytecode is an intermediate language that supports object-oriented programming. Bytecode is a language abstraction that allows Java code to run on different operating platforms, as long as the platforms have a Java Virtual Machine to execute bytecode
MS calls its own language-abstraction layer the Common Intermediate Language (CIL). Similar to bytecode, IL supports all object-oriented features, including data abstraction, inheritance, polymorphism, and useful concepts such as exceptions and events. In addition to these features, IL supports other concepts, such as properties, fields, and enumeration. Any .NET language may be converted into IL., so .NET supports multiple languages and perhaps multiple platforms in the future.

2.6 The CTS and CLS
Both the CTS and CLS ensure language compatibility, interoperability, and intefration.
2.6.1 CTS
all language should be equal in .NET. In order to make language integration a reality, MS has specified a common type system to which every .NET language must abide. MS supports a rich set of types, and there introduce some important, including value types, reference types, classes, interfaces, and delegates.
2.6.1.1 Value types: represent values allocated on the stack. They cannot be null and must always contain some data. When value types are passed into a function, they are passed by value, meaning that a copy of the values is made prior to function execution. This implies that the original value won’t change, no matter what happens to the copy during the function call. Since intrinsic types are small in size and don’t consume much memory, the resource cost of making a copy is negligible and outweighs the performance drawbacks of object management and garbage collection. Values types include primitives, structures, and enumerations; example:

int i;                            // primitives
struct point{int x, y}               // structures
enum State{off, on}             // enumerations

you can also create a value type by deriving a class from System.ValueType. One thing to note is that a value type is sealed; meaning that once you have derived a class from System.ValueType, no one else can derive from your class.

2.6.1.2 Reference types
if a type consumes significant memory resources, then a reference type provides more benefits over a value type. Reference types are so called because they contain references to heap-based objects and can be null. These types are passed by reference, meaning that when you pass such an object into a function, an address of or pointer to the object is passed—not a copy of the object, as in the case of a value type. Since you are passing a reference, the caller will see whatever the called function does to your object. The first benefit here is that a reference type can be used as an output parameter, but the second benefit is that you don’t waste extra resources because a copy is not made. If your object is large, then reference types are a better choice. In .NET, one drawback of a reference type is that it must be allocated on the managed heap, which means it requires more CPU cycles because it must be managed and garbage-collected by the CLR. In .NET, the closest concept to destruction is that finalization, but unlike destructors in C++, finalization is nondeterministic. In other words, you don’t know when finalization will happen because it occurs when the garbage collector executes. Since finalization is nondeterministic. Another drawback of reference types is that if reference-type objects hold on to expensive resources that will be released during finalization, system performances will degrade because the resources won’t released until these objects are garbage-collection. Reference types include classes, interfaces, arrays, and delegates. example:

如果一个类型消耗重要的内存资源,此时引用类型比值类型提供更多的好处。引用类型这样的叫它是因为他们包含很多基于堆栈的对象而且他们不能为空. 这些类型通过引用传输,这意味着当你传输这样的一个对象到一个函数的时候,这个对象的一个地址或指针被传输,而不是一个对象被复制,这与值类型一样。当你传输一个引用时,调用者将看到,无论这个调用是否针对你的对象。 这样做的第一个好处是引用类型可以作为对外输出的参数,但第二个好处是你不会浪费多余的资源因为并没有产生一个复制。 如果你的对象比较大,那么引用类型是您的一个很好的选择。 在.NET中引用类型的一个缺点是它必须由堆栈来管理分配,这意味着它会要求更度的CPU循环因为它由CLR来管理和进行垃圾回收,在.NET中析构的最接近的意思是最终化,但和C++不同,最终化是不确定的,换句话说,你并不知道什么时候最终化发生,因为它是有垃圾回收开始开始执行的时候而发生。因此最终化是不确定的。另外一个缺点就是引用类型是如果一个引用类型对象在最终化的时候继续消耗即将释放的资源,系统性能将会下降因为这个资源不会被释放知道这些对象被垃圾回收站回收。引用类型包括类,接口,数组和代理。例: 

class car {}               //class
interface Istellting {}       //interface
int [] a = new int[5];        //array
delegate void process()      //delegate

2.6.1.3 Boxing and unboxing
MS .NET supports values types for performance reasons, but everything in .NET is ultimately an object. In fact, all primitive types have corresponding classes in the .NET Framework. For example, int is in fact an alias of System.Int32, and System.Int32 happens to derive form System.ValueType, meaning that it is a value type. Value types are allocated on the stack by default, but they can always be converted into heap-based reference-type object, called boxing. The following code snippet shows that we can create a box and copy the value of i into it:
基于性能的原因,MS .NET支持各种值类型,但是所有的东西最终都是对象。实际上,所有的私有类型都有一个想关联的类。举例来说,int实际上是System.Int32的另一种叫法,System.Int32是从System.ValueType中派生出来的。这意味着它是一个值类型。值类型是从堆栈中默认分配,但它们经常被转换为基于堆的引用类型对象,这就叫做装箱。
[说白了:就是将一个值类型转换成一个object类型!方法:声明一个值类型,再将这个值类型隐式的转换成一个object类型,并将这个复制给该object类型]
int i = 1;
Object box=i;            //隐式
Object box= Object (i);    //
显式

when you box a value, you get an object upon which you can invoke methods, properties, and events. For example, once you have converted the integer into an object, as shown in this code snippet, you can call methods that are defined in System.Object, including ToString(), Equals(), and so forth.
[
装箱还有一个方面:就是你一个把值类型转换成一个object类型,便可以调用object类型的方法,属性和事件。]  


The reverse of boxing is of course unboxing, which means that you can convert a heap-based reference-type object into its alue-type equivalent, as shown here;
int j = (int)box; 
 

2.6.1.4 Class, Properties, indexers

转载于:https://www.cnblogs.com/yang_sy/archive/2008/03/02/1087938.html

GPU/SoC Power & Performance 架构进阶(11):Linux Power Management、BPMP/SMU 与 GPU 控制链 本文系统梳理了Linux电源管理框架(cpufreq、cpuidle、devfreq、runtime_pm)在GPU/SoC中的应用,结合NVIDIA Jetson(BPMP)与AMD GPU(SMU/PMFW)的公开案例,解析软硬件协同的功耗控制链。重点强调OPP框架作为性能请求与硬件执行的桥梁,指出实际频率/电压需跨层验证。通过只读探索与请求追踪,揭示控制路径中各环节的卡点分析方法,并警示Runtime PM中的竞态风险与引用管理关键性,为嵌入式系统能效优化提供可迁移的架构视角。 阅读详情

相关推荐

Allan方差读图分析IMU误差指标

Allan方差标定IMU参数实测分析

weixin_44927558的博客 3567

O'Reilly - .NET Framework Essentials, 2nd Edition--第二章(续)

2.6.1.4 Class, Properties, indexers see detail in the next chapter 2.6.1.5 Interfaces Interfaces support exactly the same concept as a C++ abstract base class(ABC) with only prure virtual func...

aoding8407的博客 175

稳定性仿真(stb闭环增益仿真)

stb仿真主要是测试电路的稳定性,例如运放在闭环电路中的增益和相位裕度的值,从而判别电路是否正常工作。 以下是stb仿真的过程: (1)调用iprobe器件 从analogLib中调iprobe器件,通过器件中的箭头标识确定接入电路的方法,箭头起点端连运放的输出端,箭头的终点端连在反馈环路的作用端。iprobe器件连入电路后相当于理想导线。(iprobe器件连接在反馈回路上) (2)analyses设置 勾选stb和frequency,此处的频率范围设置在0.1~1GHz,Probe Instance/T

qq_36686804的博客 3万+

O'Reilly - .NET Framework Essentials, 2nd Edition

如果你想了解.NET Framework 的基础那么这本书值得 一看!我觉得只看前三章就可以了,后面的可以选着看前面三章看完了,你对.NET Framework 就有个大致的了解了。这样对于开发asp.net的我已经足够了!下面是我自己的读书笔记: 开始读这本书,刚看完了第一章,觉得写的还不错,至少前言部分就已经吸引我了 早就开始知道一点.NET FrameWork,但是也只是知...

aoding8407的博客 576

Netty UDP

UDP是一种无连接的协议,它并不在通信双方之间建立连接,而是直接将数据包从发送端发送到接收端。UDP不保证数据包的可靠传输,也不保证数据包的顺序,因此其传输速度通常比TCP快,且系统开销较小。然而,这也意味着UDP在某些情况下可能会丢失数据包或数据包到达的顺序错乱。

王小工小工历程 2027

英飞凌AURIX™ Development Studio(ADS)工程调试与烧录实战指南

本文详细介绍了英飞凌AURIX™ Development Studio(ADS)的工程调试与烧录实战指南。从调试环境搭建、硬件连接到断点设置、变量监控等核心调试技巧,帮助开发者快速掌握ADS安装使用教程,提升多核处理器开发效率。

k8l9m0n的博客 574

O'Reilly - .NET Framework Essentials, 2nd Edition--第一章

开始读这本书,刚看完了第一章,觉得写的还不错,至少前言部分就已经吸引我了 早就开始知道一点.NET FrameWork,但是也只是知之皮毛,现在正好好好的学习一下 这将是一个系列的blog,我会把一步步的来完成。 第一章是简介,所以很多东西我都是跳着看,呵呵,由于本书是英文的,才发现偶尔会出现一个单词,不认识了,呵呵,一直来以为自己的英语足够应付了,呵呵,看来还得加强...

aoding8407的博客 190

Claude Code 100个真实案例 - 用AI设计Arduino PCB电路板(硬件小白也能画板)

本案例展示如何使用 Claude Code 配合 KiCad 的 Python 脚本接口,从零设计一块 Arduino 传感器扩展板 PCB。从原理图符号创建、网表生成到 PCB 布局布线,全程自动化完成,最终输出可直接发给工厂打样的 Gerber 文件。

yueyeguzhuo的专栏 444

O'Reilly - .NET Framework Essentials, 2nd Edition--第三章

3.1 common programming model 3.1.1 System.Object Every type in .NET is an object, meaning that it must derive directly or indirectly form the Object class. The Object class exposes the public...

aoding8407的博客 162

嵌入式系统开发笔记112:通过有人云测试MQTT

项目中使用到“有人”公司的WH-LTE-7S0模块,本文讲解通过有人云进行MQTT测试的方法。

snmplink的博客 999

22、忆阻器、忆阻系统及其神经形态应用综述

本文综述了忆阻器与忆阻系统的理论基础及其在神经形态系统中的广泛应用。从忆阻器的基本定义出发,介绍了其在非线性电路、存储技术、通信和神经形态计算等领域的应用潜力。重点探讨了基于忆阻器的神经元模型(如Hodgkin-Huxley、FitzHugh-Nagumo和Hindmarsh-Rose模型)、突触实现方式及多种忆阻神经网络架构,包括细胞神经网络、脉冲神经网络和递归神经网络等。此外,深入分析了忆阻器在水库计算中的理论研究与硬件实现进展,展示了其在时间序列处理、模式识别和信号预测等方面的优异性能。尽管忆阻技术前

kiwi8的博客 207

[免费下载 经典英文原版书] O'Reilly - C# Essentials 2nd Edition

 OReilly - C# Essentials 2nd Edition   更新日期: 2005年09月03日文件大小: 348.134KB图书格式: HTML/CHM图书语言: 英语   内容简介C# Essentials is a highly condensed introduction to the C# language and the .NET Framework. C# and

净心编程 2152

肖特基二极管选型参数,结构原理,工艺与注意问题总结

肖特基二极管(Schottky Diode)是一种特殊的二极管,也被称为肖特基势垒二极管。它是利用金属与半导体接触形成的金属-半导体结原理制成的。与传统的PN结二极管相比,肖特基二极管具有更低的正向压降、更高的开关速度、更高的反向恢复时间以及更好的温度稳定性等特点。本文对肖特基二极管的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 813

小白一键部署:VoiceStudio 本地语音工作室(Linux/Win/Mac)

VoiceStudio 是破十万星的开源本地语音工作室。本文在 Debian 13 实机用官方一行命令装上 0.5.7,记录 GPU 崩溃启动参数、Install local runtime、模型许可,以及 CPU 上 Voice Design 合成 7 秒 demo。与只做听写的 Hex 互补。

m0_56699208的博客 177

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

导出 ONNX 后 top-1 翻转:数值差 1e-3,先查 model.eval() 再比 opset

模型导出 ONNX 后数值偏移,边界样本 top-1 随之翻转。排查按导出模式、opset 版本与算子实现分三层展开并配复现脚本。该方法适用于部署前一致性验证,追求逐位一致仍需接受规范差异。

昨日种种,皆成今我。今日种种,皆成新我。 191

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

龙芯3a6000 银河麒麟v10sp1安装.net10全过程,编译libicu67

在龙芯平台安装.NET时,因缺少libicu67依赖,通过编译源码解决。下载ICU 67.1源码,替换支持LoongArch的config脚本,并修改double-conversion-utils.h以适配架构。使用runConfigureICULinux配置,编译后用checkinstall生成deb包,成功安装libicu67,后续顺利部署.NET运行时及SDK。资源链接已提供,仅供学习参考。

feetcrack的博客 191

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

导出ONNX后精度从95%跌到70%且零报错:先量级分诊再查tracing分支

导出 ONNX 后推理与 eager 静默不一致,指标下滑无报错。根因是 tracing 按样例输入固化分支,按差异量级分诊后定位控制流。

昨日种种,皆成今我。今日种种,皆成新我。 163

章节10:AI编译的范畴-对比MLIR和TPU-MLIR

章节1:什么是MLIR章节2:MLIR的引入章节3:MLIR完成一个端到端的流程章节4:编写一个pass章节5:MLIR相关语法章节6:量化相关章节7:训练相关章节8:图优化章节9:理解典型网络与编译器图优化一、最典型的工作模式“针对某种芯片,在 MLIR 上构建专用编译工具链”——这确实是当前 AI 编译器领域最主流、最核心的工作范式。TPU-MLIR 就是标准样板:定义芯片专用的 Dialect(Top/Tpu);实现硬件相关的 Pass(LayerGroup、权重重排、内存规划);包裹完整的前端导入、

vcvdv123的博客 349

重装 openvino、yaml-cpp

【代码】重装 yaml-cpp。

u010948546的博客 221

YLT 智能助手(小岳)· 02|运行时装配与依赖注入

本文详解YLT智能助手的“装配根”设计:通过五阶段分步初始化(治理→核心→能力→服务→生命),以显式顺序声明依赖,实现47个组件的有序装配。摒弃自动DI容器,采用手工注入避免循环依赖与生命周期错乱,用显式门面替代setattr动态绑定,确保可读性、可测试性与架构清晰。核心思想是“构造即依赖”,让100+对象在单进程内协同无冲突,为桌面Agent提供可复用的手工依赖注入范式。

u010972645的博客 215

库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返

外挂向量库的RAG架构,一次语义检索要在应用层和向量库之间走两次网络往返:查业务表拿上下文,再拿上下文去向量库做相似度匹配,最后在应用层拼装。金仓KES AI数据库把AI推理算子下推到数据库执行引擎中,关系过滤与向量相似度计算在同一执行计划中协同完成。本文拆解“计算向数据移动”的范式转变、ONNX Runtime嵌入内核的工程路径,以及算子融合如何把延迟从“两次往返”压到“一次执行”。

DBAxiaoye的博客 127

PyTorch导出ONNX后argmax翻转:差异跳变指向tracing而非精度

模型导出 ONNX 后输出与 PyTorch 不一致,个别输入会导致预测类别翻转。本文用语义链路查控制流固化、数值链路查浮点差异的双线排查定位根因。

昨日种种,皆成今我。今日种种,皆成新我。 204

移动架构第五次转身:用户往往只有模糊目标

移动架构每轮进化皆源于底层假设崩塌。从原生到AgentRuntime,核心转变是应对用户模糊意图——传统流程需手动拆解,而AgentRuntime通过分层运行时(输入层、AgentCore、NativeCapabilitySDK、后端服务)实现意图理解与任务编排。

QingyunAI的博客 288

OpenCode vs Claude Code:Agent 编排机制对比(2026 年 11 月)

对比 OpenCode 与 Claude Code 的 Agent 编排机制:Parent-Child 委托模型 vs 团队共享任务列表,覆盖任务生命周期、上下文隔离、通信方式、并发、恢复与扩展能力,并给出做 Agent Runtime 与自治团队的选型建议。

weixin_45284808的博客 314

LangGraph 中的 Runtime Context 是什么?

Runtime Context 是 LangGraph 中用来承载「运行环境与依赖」的机制,它把用户身份、租户信息、客户端、配置等与业务数据无关的内容从 State 中剥离出来,通过。Runtime Context 把这些「与业务数据无关、但节点运行需要」的东西抽离出来,通过统一的入口注入,节点按需读取,既干净又灵活。正确区分 State 与 Runtime Context,能让你的图结构更清晰、状态更干净、测试更容易。理解这个区别,是正确使用 Runtime Context 的前提。

张晨光老师的播客 386

hi3519dv500OSD示例实现讲解

sample_vio_osd.c 实现Hi3519DV500平台OSD功能,通过初始化时间与四角框区域参数,调用SDK接口创建并绑定Region至VENC/VPS通道。时间OSD采用双缓冲、周期刷新机制,支持自定义位置、颜色及字体放大;四角框则通过配置坐标、线宽与颜色实现。模块提供启动/停止接口,管理线程与资源,确保显示稳定可靠。

m0_75040012的博客 303
上一篇: O'Reilly - .NET Framework Essentials, 2nd Edition--第二章(续)
下一篇: O'Reilly - .NET Framework Essentials, 2nd Edition--第三章
aoding8407
博客等级 码龄11年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值