
在 C# 中... 是一个至关重要的类。它是 托管代码 ( Code, C#) 与 非托管代码 ( Code, C/C) 之间的桥梁。第一部关于C#的分章节内容, 这是一份从基础到进阶的总结资料。第一部分主要讲解的是基本概念, 也就是先弄清楚到底什么是C#。这一小节属于入门级别的内容。在C#编程环境里头, 程序使用的内存空间是交给一个叫垃圾回收器的工具去自动管着的, 而要是换成C加C加语言呢, 那就是得由写代码的程序员自己来负责申请内存还有释放内存这两件事了。那个类呢, 它提供了一系列的方法, 这些方法的作用是用来做下面这一些事情:2. 基础操作就是处理字符串还有数值, 这属于基础级的范围。在非托管 API 的使用场景中, 通常情况下是需要去使用指针的。而我们现在所做的这个动作, 是可以帮助我们一起去完成相关的这种转换工作的。3. 结构体和指针, 这个是属于高级进阶的那个类别。当你在这个过程里面, 需要去调用一个那种专门用来接收 C 语言里面的结构体数据的动态链接库函数的时候, 你就非得用到某些特定的东西不可。4. 函数指针与回调 (深度级)你能够把 C#里的这个内容转成C语言可以认识的函数指针。public delegate void MyCallback(int progress);// 将 C# 委托转为函数指针MyCallback del (p) Console.WriteLine($进度: {p}%);IntPtr funcPtr Marshal.GetFunctionPointerForDelegate(del);// 传递给 C 库使用5. 这就是关于自定义封送以及高性能操作部分的内容, 并且它面向的是专家级别的读者, 也就是那些具备高级专业能力的人。在进行极致性能要求的场景的时候, 可以采用相应的类以及 Span 类型来配合使用。第二部先把知识点还有那些容易出错的地方做个整理, 这是版本的。把核心的知识内容一条条梳理清楚。第一点要讲的是内存的申请还有释放。后面括号里是方法说明, 它对应的其实是C语言相关的概念。在全局堆申请内存把那些已经申请过了的内存, 给放出来。free申请 COM 任务内存释放 COM 任务内存2. 封送属性, 还有3. 那个常用的静态方法, 以及必须得要清楚的容易出错的地方是1. 内存泄漏, 这在整个里面排第一。这里有一个容易踩到的坑, 就是托管代码本身是带有垃圾回收机制的, 但是通过点号后面跟着的那个方式去申请的内存, 却是不受到垃圾回收机制的管理和控制的。对策必须在 块中调用或者使用 包装指针。2. 委托被 GC 回收这个需要注意的地方, 就是当你将回调函数通过某种方式传递给 C 程序之后, 如果C#这一端, 没有保存好该委托的引用内容, 那么垃圾回收机制, 就会认为它, 确实已经不再被使用, 最后, 就把其进行回收。结果是, 当执行C回调的时候, 会触发异常现象, 也就是发生了非法访问内存的情况。具体的解决方式是, 在C类别里头, 采用一个那种静态状态的变量, 或者是拥有比较长生存周期的成员状态变量, 来对那个委托进行引用操作。3. 是类型这个范畴, 还是非类型这个范畴。这具体的知识要点。4. 字符串编码问题坑点、 (UTF-16)、 容易混淆。结果乱码。应对的方法是, 务必要核实清楚, C这一边接收到的参数, 到底是指向字符的指针即所谓的ANSI编码形式呢, 还是指向别的某种类型括号内的内容。这两者之间必须做到严丝合缝、严格对应起来。5. 这个数组就是固定好的, 没有那些空的括号在里面。这里面的一个坑点是说, 垃圾回收机制在忙着回收内存块的时候, 它会移动那些对象所在的地方。要是你把那个被管理数组存放的实际地址直接交出去给C代码去用, 这个地址很有可能会就变成没有效用的状态了。建议把对象锁住, 办法是用 Alloc(obj, .) 来锁定对象, 或者是在代码块内部去使用 fixed 这个关键字。6. 在内存里面进行安排的时候, 要遵循那个结构体对齐()的规则。这里存在一个容易被忽略的坑, 就是C#默认采用的对齐方式, 它有可能与C使用的对齐方式为不一样, 例如C可以通过# pack(1)这个设定来进行配置。具体的解决法子, 是在。在相关的设置或者配置当中, 明确地指出了需要去设定 Pack 这个参数, 比如说。参数设置是PACK, 其数值等于1。总结建议你在需要使用那个类别的时候, 一定要记住这个规矩, 简单来说就是谁申请了内存空间, 就得由这个人去释放它, 在显式地进行布局操作的时候, 千万要注意管理好对象的生命周期, 这个玩意儿就像一把非常锋利的手术刀一样, 能够让你直接地对底层内存进行操作, 但是它同时也极其危险, 一不小心可能就会导致严重的问题出现。