2025-10-15
C#
00

SimpleWifi 是一个优秀的C#开发库,用于简化WiFi网络的管理操作。本文将详细介绍其使用方法和实际应用场景。

环境准备

首先需要通过NuGet安装SimpleWifi包:

Bash
Install-Package SimpleWifi.netstandard.Lsh

image.png

2025-10-15
C#
00

.NET Compiler Platform (Roslyn) SDK提供了强大的语法分析和转换功能。本文将介绍如何使用Roslyn进行代码转换,包括两种主要方法:

  • 使用Factory方法创建和修改语法树
  • 使用SyntaxRewriter进行批量转换

环境准备

首先需要安装Visual Studio和.NET Compiler Platform SDK:

  1. 打开Visual Studio Installer
  2. 选择"修改"
  3. 可以通过以下两种方式之一安装:
    • 工作负载视图:选择"Visual Studio扩展开发"工作负载,然后在可选组件中勾选".NET Compiler Platform SDK"
    • 单个组件视图:直接勾选".NET Compiler Platform SDK"

image.png

2025-10-15
C#
00

Roslyn 提供了两个主要的 API 来分析代码:语法 API(Syntax API)和语义 API(Semantic API)。其中,语法 API 用于分析代码的结构,而语义 API 则专注于分析代码的语义和含义。本文将重点介绍与语义分析相关的 API 使用方法。

核心概念

Compilation(编译单元)

Compilation代表编译器视角下的一个完整项目,包含:

  • 源代码文件
  • 程序集引用
  • 编译选项
C#
// 创建编译单元 var compilation = CSharpCompilation.Create("HelloWorld") .AddReferences(MetadataReference.CreateFromFile( typeof(string).Assembly.Location)) .AddSyntaxTrees(syntaxTree);

SemanticModel(语义模型)

SemanticModel提供了类似IDE智能提示的功能:

  • 查询作用域内的名称
  • 查询可访问的成员
  • 分析表达式引用的对象
C#
// 获取语义模型 SemanticModel model = compilation.GetSemanticModel(syntaxTree);

实战示例

分析命名空间

C#
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; namespace AppRoslyn { internal class Program { static void Main(string[] args) { // 示例程序 const string code = @" using System; namespace Demo { class Program { static void Main() { Console.WriteLine(""Hello""); } } }"; // 解析语法树 SyntaxTree tree = CSharpSyntaxTree.ParseText(code); var root = tree.GetCompilationUnitRoot(); // 创建编译单元和语义模型 var compilation = CSharpCompilation.Create("Demo") .AddReferences(MetadataReference.CreateFromFile(typeof(string).Assembly.Location)) .AddSyntaxTrees(tree); var model = compilation.GetSemanticModel(tree); // 获取using System的符号信息 var firstUsing = root.Usings[0]; var systemName = firstUsing.Name; var symbolInfo = model.GetSymbolInfo(systemName); // 分析System命名空间 var systemSymbol = (INamespaceSymbol)symbolInfo.Symbol; foreach (var ns in systemSymbol.GetNamespaceMembers()) { Console.WriteLine(ns); // 输出子命名空间 } Console.ReadKey(); } } }

image.png

分析类型信息

2025-10-15
C#
00

语法分析是理解和处理C#代码的基础。通过.NET Compiler Platform SDK (也称为Roslyn),我们可以分析、理解和转换C#代码的结构。

语法树的基本概念

语法树是编译器用来理解代码的数据结构。它具有以下特点:

  • 完整性:代表源代码中的所有信息
  • 不可变性:创建后无法修改
  • 线程安全:可以在多个线程中并发访问

语法树的主要组成部分

C#
// 四个主要构建块 1. SyntaxTree // 表示整个解析树 2. SyntaxNode // 表示语法结构(如声明、语句等) 3. SyntaxToken // 表示关键字、标识符、运算符等 4. SyntaxTrivia // 表示空白、注释等

实战示例

基础示例 - 解析Hello World

C#
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace AppSyntaxAnalysis { internal class Program { static void Main(string[] args) { // 要分析的代码 string sourceCode = @" using System; class Program { static void Main(string[] args) { Console.WriteLine(""Hello World!""); } }"; // 解析代码生成语法树 SyntaxTree tree = CSharpSyntaxTree.ParseText(sourceCode); // 获取根节点 CompilationUnitSyntax root = tree.GetCompilationUnitRoot(); // 分析using指令 foreach (UsingDirectiveSyntax usingDirective in root.Usings) { Console.WriteLine($"Using: {usingDirective.Name}"); } Console.ReadKey(); } } }

image.png

2025-10-14
C#
00

在进行WinForm到WPF的转型时,CheckBox是常用的控件之一。它允许用户进行布尔选项的选择或取消选择。本文将介绍在WPF环境下如何使用CheckBox并自定义它的样式,并与WinForm做简单对比。

基础概念

在WinForm中,你可以直接从工具箱拖拽一个CheckBox到Form上,然后在属性面板设置Text、Checked等属性。WPF的工作流程更偏向于界面与逻辑分离:

  • XAML文件中负责定义界面
  • C#后台代码(.cs)中实现逻辑

以下将展示一个基本的CheckBox示例代码与样式定制示例,帮助理解WPF中CheckBox的用法。

基本示例

这里展示一个最简单的CheckBox示例,包含以下功能:

  • 一个CheckBox,绑定点击事件
  • 在文本下方使用一个TextBlock来显示CheckBox的选择状态

XAML文件

XML
<Window x:Class="AppCheckbox.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:AppCheckbox" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <!-- 这是一个简单的CheckBox --> <CheckBox x:Name="myCheckBox" Content="选中我" HorizontalAlignment="Center" VerticalAlignment="Center" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"> </CheckBox> <!-- 用来显示当前CheckBox的状态 --> <TextBlock x:Name="tbStatus" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,30,0,0" FontSize="16" Text="当前状态:未选中"> </TextBlock> </Grid> </Window>