roslyn

实现一个基于动态代理的 AOP

柔情痞子 提交于 2020-04-23 09:55:39
实现一个基于动态代理的 AOP Intro 上次看基于动态代理的 AOP 框架实现,立了一个 Flag, 自己写一个简单的 AOP 实现示例,今天过来填坑了 目前的实现是基于 Emit 来做的,后面有时间再写一个基于 Roslyn 来实现的示例 效果演示 演示代码: 切面逻辑定义: public class TryInvokeAspect : AbstractAspect { public override void Invoke(MethodInvocationContext methodInvocationContext, Action next) { Console.WriteLine($"begin invoke method {methodInvocationContext.ProxyMethod.Name} in {GetType().Name}..."); try { next(); } catch (Exception e) { Console.WriteLine($"Invoke {methodInvocationContext.ProxyMethod.DeclaringType?.FullName}.{methodInvocationContext.ProxyMethod.Name} exception"); Console.WriteLine(e); }

Visual Studio离线安装

女生的网名这么多〃 提交于 2020-04-18 05:47:58
先从有网络的电脑下载离线安装包,然后再复制到没有网络的电脑进行离线安装。 1.官网下载安装器: https://visualstudio.microsoft.com/zh-hans/downloads/ 并选择对应的版本。 2.接下来就是下载安装文件,但是整个visual studio的完全安装文件非常大,可以只下载所需的部分,比如Unity3d开发者的下载列表如下: 1> https://docs.microsoft.com/zh-cn/visualstudio/install/workload-and-component-ids 2> https://docs.microsoft.com/zh-cn/visualstudio/install/workload-component-id-vs-enterprise#game-development-with-unity Unity引擎可以从官网下载,因此列表后面的可选两项可以不用下载。 因此我们的指令是vs_enterprise.exe --layout --add Microsoft.Net.Component.3.5.DeveloperTools --add Microsoft.Net.Component.4.7.1.TargetingPack --add Microsoft.VisualStudio.Component

.NET 下基于动态代理的 AOP 框架实现揭秘

▼魔方 西西 提交于 2020-04-17 20:21:29
.NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 https://www.cnblogs.com/weihanli/p/roslyn-based-condition-eval-engine.html 执行过程中会根据条件的不同会在运行时创建一个类,每一次创建都会生成一个新的程序集,我觉得这样实现的话可能会导致加载的程序集越来越多,虽然目前我们的使用场景下不会有很多,而且相同的条件只会生成一次,还是觉得这样不是特别好,此时想起来了一些 AOP 框架, Aspect.Core / Castle / DispatchProxy ,他们这些 AOP 框架会生成一些代码类,好像也没有生成很多额外的程序集,于是打算看看这些 AOP 框架的实现,看看它们是如何生成动态代理类的 动态代理实现原理 看了这三个 AOP 框架的实现代码之后,实现原理基本都是一样的 都是通过创建一个 DynamicAssembly 之后在这个 DynamicAssemly 中创建要动态生成代理类,通过 Emit 创建要生成动态代理类的方法/属性等 来个小示例 多说不如来点代码示例: internal class ProxyUtil { private const string ProxyAssemblyName = "Aop

.NET 下基于动态代理的 AOP 框架实现揭秘

瘦欲@ 提交于 2020-04-17 20:07:02
.NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 https://www.cnblogs.com/weihanli/p/roslyn-based-condition-eval-engine.html 执行过程中会根据条件的不同会在运行时创建一个类,每一次创建都会生成一个新的程序集,我觉得这样实现的话可能会导致加载的程序集越来越多,虽然目前我们的使用场景下不会有很多,而且相同的条件只会生成一次,还是觉得这样不是特别好,此时想起来了一些 AOP 框架, Aspect.Core / Castle / DispatchProxy ,他们这些 AOP 框架会生成一些代码类,好像也没有生成很多额外的程序集,于是打算看看这些 AOP 框架的实现,看看它们是如何生成动态代理类的 动态代理实现原理 看了这三个 AOP 框架的实现代码之后,实现原理基本都是一样的 都是通过创建一个 DynamicAssembly 之后在这个 DynamicAssemly 中创建要动态生成代理类,通过 Emit 创建要生成动态代理类的方法/属性等 来个小示例 多说不如来点代码示例: internal class ProxyUtil { private const string ProxyAssemblyName = "Aop

.NET 下基于动态代理的 AOP 框架实现揭秘

回眸只為那壹抹淺笑 提交于 2020-04-17 14:25:32
【推荐阅读】微服务还能火多久?>>> .NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 https://www.cnblogs.com/weihanli/p/roslyn-based-condition-eval-engine.html 执行过程中会根据条件的不同会在运行时创建一个类,每一次创建都会生成一个新的程序集,我觉得这样实现的话可能会导致加载的程序集越来越多,虽然目前我们的使用场景下不会有很多,而且相同的条件只会生成一次,还是觉得这样不是特别好,此时想起来了一些 AOP 框架, Aspect.Core / Castle / DispatchProxy ,他们这些 AOP 框架会生成一些代码类,好像也没有生成很多额外的程序集,于是打算看看这些 AOP 框架的实现,看看它们是如何生成动态代理类的 动态代理实现原理 看了这三个 AOP 框架的实现代码之后,实现原理基本都是一样的 都是通过创建一个 DynamicAssembly 之后在这个 DynamicAssemly 中创建要动态生成代理类,通过 Emit 创建要生成动态代理类的方法/属性等 来个小示例 多说不如来点代码示例: internal class ProxyUtil { private const string

.NET 下基于动态代理的 AOP 框架实现揭秘

江枫思渺然 提交于 2020-04-17 13:56:14
【推荐阅读】微服务还能火多久?>>> .NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 https://www.cnblogs.com/weihanli/p/roslyn-based-condition-eval-engine.html 执行过程中会根据条件的不同会在运行时创建一个类,每一次创建都会生成一个新的程序集,我觉得这样实现的话可能会导致加载的程序集越来越多,虽然目前我们的使用场景下不会有很多,而且相同的条件只会生成一次,还是觉得这样不是特别好,此时想起来了一些 AOP 框架, Aspect.Core / Castle / DispatchProxy ,他们这些 AOP 框架会生成一些代码类,好像也没有生成很多额外的程序集,于是打算看看这些 AOP 框架的实现,看看它们是如何生成动态代理类的 动态代理实现原理 看了这三个 AOP 框架的实现代码之后,实现原理基本都是一样的 都是通过创建一个 DynamicAssembly 之后在这个 DynamicAssemly 中创建要动态生成代理类,通过 Emit 创建要生成动态代理类的方法/属性等 来个小示例 多说不如来点代码示例: internal class ProxyUtil { private const string

Roslyn compilation - how to reference a .NET Standard 2.0 class library

不问归期 提交于 2020-04-16 05:41:51
问题 I created a console application project (targeting .NET Core 3.0) and a class library (targeting .NET Standard 2.0). The console application tries to use the Roslyn compiler to compile some C# code that references that previously created class library. I'm hitting some major issues though. Here's the code for the console application (note that most of it is example code from https://github.com/joelmartinez/dotnet-core-roslyn-sample/blob/master/Program.cs): using Microsoft.CodeAnalysis; using

[ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?

最后都变了- 提交于 2020-04-11 19:49:58
昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是否有好解决方案。我当时在外边,回复不太方便,所以只给他说了两个接口/类型:IActionDescriptorProvider和ApplicationPartManager。这是一个挺有意思的问题,所以回家后通过两种方案实现了这个需求。源代码从 这里 下载。 一、实现的效果 我们先来看看实现的效果。如下所示的是一个MVC应用的主页,我们可以在文本框中通过编写C#代码定义一个有效的Controller类型,然后点击“Register”按钮,定义的Controller类型将自动注册到MVC应用中 由于我们采用了针对模板为“{controller}/{action}”的约定路由,所以我们采用路径“/foo/bar”就可以访问上图中定义在FooController中的Action方法Bar,下图证实了这一点。 二、动态编译源代码 要实现如上所示的“针对Controller类型的动态注册”,首先需要解决的是针对提供源代码的动态编译问题,我们知道这个可以利用Roslyn来解决。具体来说,我们定义了如下这个ICompiler接口,它的Compile方法将会对参数sourceCode提供的源代码进行编译

How to measure the nesting level of method using C# Roslyn

拜拜、爱过 提交于 2020-04-11 08:43:50
问题 I want to measure a "nesting level" of a method using Roslyn, for example: if the method contains only one expression its level is 0. If the method contains nested if(cond1) if(cond2) its level is 1. I try to use Roslyn's nodes, but I don't understand how to get only the body of the while or the if construction without it's condition and other things. 回答1: You can use SyntaxVisitor for this: it recursively walks the syntax tree and executes your code for each node, depending on its type. You

[ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?

不问归期 提交于 2020-04-09 04:52:52
昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是否有好解决方案。我当时在外边,回复不太方便,所以只给他说了两个接口/类型:IActionDescriptorProvider和ApplicationPartManager。这是一个挺有意思的问题,所以回家后通过两种方案实现了这个需求。源代码从 这里 下载。 一、实现的效果 我们先来看看实现的效果。如下所示的是一个MVC应用的主页,我们可以在文本框中通过编写C#代码定义一个有效的Controller类型,然后点击“Register”按钮,定义的Controller类型将自动注册到MVC应用中 由于我们采用了针对模板为“{controller}/{action}”的约定路由,所以我们采用路径“/foo/bar”就可以访问上图中定义在FooController中的Action方法Bar,下图证实了这一点。 二、动态编译源代码 要实现如上所示的“针对Controller类型的动态注册”,首先需要解决的是针对提供源代码的动态编译问题,我们知道这个可以利用Roslyn来解决。具体来说,我们定义了如下这个ICompiler接口,它的Compile方法将会对参数sourceCode提供的源代码进行编译