<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Visual Studio on LeafCxy's Blog</title><link>https://leafcxy.github.io/tags/visual-studio/</link><description>Recent content in Visual Studio on LeafCxy's Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 24 Jul 2025 07:48:10 +0000</lastBuildDate><atom:link href="https://leafcxy.github.io/tags/visual-studio/index.xml" rel="self" type="application/rss+xml"/><item><title>vs2019离线安装包制作</title><link>https://leafcxy.github.io/posts/2025-07-24-15/</link><pubDate>Thu, 24 Jul 2025 07:48:10 +0000</pubDate><guid>https://leafcxy.github.io/posts/2025-07-24-15/</guid><description>&lt;h2 id="vs2009脱机安装"&gt;vs2009脱机安装&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;执行layout.cmd,需要网络,如果已经下载localVSlayout,可以跳过这一步&lt;/li&gt;
&lt;li&gt;执行cert.cmd,不需要网络.&lt;/li&gt;
&lt;li&gt;执行setup.cmd,不需要网络.&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- more --&gt;
&lt;p&gt;脱机安装指引&amp;gt;&lt;a href="https://docs.microsoft.com/en-us/visualstudio/install/create-an-offline-installation-of-visual-studio?view=vs-2019"&gt;https://docs.microsoft.com/en-us/visualstudio/install/create-an-offline-installation-of-visual-studio?view=vs-2019&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可以参考1,3步命令下载安装其他组件
工作负载和组件id官网地址&amp;gt;&lt;a href="https://docs.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-professional?view=vs-2019"&gt;https://docs.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-professional?view=vs-2019&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;命令含义：
vs_Professional.exe：前一步下载的 Visual Studio 引导程序
&amp;ndash;layout：指定 VS2019 相关组件的下载目录，设置为当前目录下的 vs2019_layout 目录。
&amp;ndash;add：添加将要下载的工作负载，添加的是 NativeDesktop、ManagedDesktop
&amp;ndash;includeRecommended：安装相关工作负载的推荐组件(另一个参数 &amp;ndash;includeOptional 将会下载选定的工作负载中可选的组件，会导致下载的安装包过大，不建议使用。)
&amp;ndash;lang：下载指定的语言包，本人下载了英文(en-US)、中文(zh-CN)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bat" data-lang="bat"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;%layout.cmd%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vs_Professional.exe --layout d:\vs2019\localVSlayout --add Microsoft.VisualStudio.Workload.ManagedDesktop --add Microsoft.VisualStudio.Workload.NetWeb --add Component.GitHub.VisualStudio --includeRecommended --lang en-US
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;pause&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;%cert.cmd%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;certutil.exe -addstore -f &lt;span style="color:#e6db74"&gt;&amp;#34;Root&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;D:\vs2019\localVSlayout\certificates\manifestRootCertificate.cer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;certutil.exe -addstore -f &lt;span style="color:#e6db74"&gt;&amp;#34;Root&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;D:\vs2019\localVSlayout\certificates\manifestCounterSignRootCertificate.cer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;certutil.exe -addstore -f &lt;span style="color:#e6db74"&gt;&amp;#34;Root&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;D:\vs2019\localVSlayout\certificates\vs_installer_opc.RootCertificate.cer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;pause&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;%setup.cmd%
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;cd&lt;/span&gt; localVSlayout
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vs_Professional.exe --noweb --add Microsoft.VisualStudio.Workload.ManagedDesktop --add Microsoft.VisualStudio.Workload.NetWeb --add Component.GitHub.VisualStudio --includeRecommended
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;pause&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Roslyn</title><link>https://leafcxy.github.io/posts/2025-07-22-10/</link><pubDate>Tue, 22 Jul 2025 08:38:07 +0000</pubDate><guid>https://leafcxy.github.io/posts/2025-07-22-10/</guid><description>&lt;p&gt;Roslyn 是以 API 为驱动的下一代编译器，集成在最新版的 Visual Studio 上。它开放 C# 和 Visual Basic 编译器的 API，使得开发者可以借助编译器进行解析代码文件、动态为编程语言增加功能、扩展编译器、自定义编译器动作等操作。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;将Roslyn编译结果保存在流中，用程序集加载方法将流加载到当前程序集中，就可以在当前的程序集中调用了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; System;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; System.Linq;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; System.Text;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; System.Threading.Tasks;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; Microsoft.CodeAnalysis;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; Microsoft.CodeAnalysis.CSharp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; Microsoft.CodeAnalysis.CSharp.Syntax;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;namespace&lt;/span&gt; RoslynDemo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Program&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; Main(&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;[] args)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 加载C#程序集 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; assembly = Assembly.Load(&lt;span style="color:#e6db74"&gt;&amp;#34;System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; compilation = CSharpCompilation.Create(&lt;span style="color:#e6db74"&gt;&amp;#34;HelloWorld&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .AddReferences(assembly)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .AddSyntaxTrees(SyntaxFactory.ParseSyntaxTree(&lt;span style="color:#e6db74"&gt;&amp;#34;using System; class Program { static void Main() { Console.WriteLine(\&amp;#34;Hello, World!\&amp;#34;); } }&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 生成程序集和语法树 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; assembly = compilation.Emit(&lt;span style="color:#e6db74"&gt;&amp;#34;HelloWorld.dll&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; syntaxTree = compilation.SyntaxTrees.Single();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 解析语法树并提取方法信息 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; root = syntaxTree.GetRoot();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; methods = root.DescendantNodes().OfType&amp;lt;MethodDeclarationSyntax&amp;gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;foreach&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; method &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; methods)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Console.WriteLine(&lt;span style="color:#e6db74"&gt;&amp;#34;方法名称：{0}&amp;#34;&lt;/span&gt;, method.Identifier);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Console.WriteLine(&lt;span style="color:#e6db74"&gt;&amp;#34;方法返回类型：{0}&amp;#34;&lt;/span&gt;, method.Type);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Console.WriteLine(&lt;span style="color:#e6db74"&gt;&amp;#34;方法体：&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Console.WriteLine(method.Body);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Console.WriteLine();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>