Skip to content

Latest commit

 

History

History
390 lines (279 loc) · 12.4 KB

WorkingDocument.md

File metadata and controls

390 lines (279 loc) · 12.4 KB

工作文档

0427

添加自动发布包任务

 1.使用
   a.任意位置 msbuild <Project/solution> -t:ReleaseNuGetToRemote 即可自动发布包
   b.在项目目录直接使用 msbuild -t:ReleaseNuGetToRemote
 2.发布过后会将发布日志保存到 \artifacts\logs\nuGetLogs\<NuGetPackageName>.log

 注:
   1.使用解决方案[solution]发布包,会将解决方案中所有会生成包的项目都发布
   2.使用项目发布包自会发布当前项目

0428

处理 vscode 自动生成的文件

当前看到:https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#just-my-code

0429

续-处理 vscode 自动生成的文件

tasks.json    自定义任务文件
launch.json   调试文件

处理完成添加
tasks.json 的文档文件 taskDocument.ts
launch.json 的实例文件 launchExamples.json

研究附加进程调试

1.调试文件(launch.json) 添加一个 attach 案例
2.启动调试,选择要附加的进程即可(好像需要代码和进程是同一版本)

attach 案例:
{
  "name": ".NET Core Attach",
  "type": "coreclr",
  "request": "attach",
}

MergeJson 发布任务时原 json 被发布,合并的 json 没有被发布

问题描述
1.发布项目中存在 Easy.Tool.MergeJosn.dll
2.合并的json文件没有被发布
3.原json被发布

解决方案
1.在包引用上添加 ExcludeAssets="runtime" ,标记排除资产(直接使用dotnet build [项目](会先执行 restore 还原) 时还是会复制到项目)
2.在合并json后将合并成功的主json添加到 ContentWithTargetPath 项中,publish 任务自动会发布里面的文件
3.将原json从内容中移除(或者设置内容的 CopyToPublishDirectory 元数据不等于 PreserveNewest ----该想法待验证)

0430

MergeJson 生成时会将 Easy.Tool.MergeJson.dll 复制到生成文件

问题描述:
1.使用 dotnet build [项目] 时,会将 Easy.Tool.MergeJson.dll 复制到生成文件
2.使用 dotnet restore [项目] 还原后,使用msbuild [项目] ,会将 Easy.Tool.MergeJson.dll 复制到生成文件
3.但是使用 visual studio 生成项目时并不会将 Easy.Tool.MergeJson.dll 复制到生成文件
  (个人感觉visual studio还原项目时就导入nuget包的targets文件,但是使用 dotnet restore 还原时并没有导入)

解决方案:
1.在解析引用包过后标记包不复制到生成文件中
  在 ResolvePackageAssets 执行后,修改 @(RuntimeCopyLocalItems) 中 %(NuGetPackageId) == 'Easy.Tool.MergeJson.dll' 的 %(CopyLocal) 值为 false

注:
1.dotnet build [项目] 会执行 restore 和 build

0501

0430 处理 解决 MergeJson 在项目生成时异常 后的新想法(废弃)

想法:
1.在 ResolvePackageAssets 执行之前 将@(PackageReference) 中的 'Easy.Tool.MergeJson' 移除
2.在 ResolvePackageAssets 执行执行之后再将'Easy.Tool.MergeJson'加入

废弃原因:
1.获取应该导入的程序集是从 project.assets.json 中读取,修改引用的包不会照成影响

废弃主要 terget

<Target Name="CutMergeJsonPackageReference" BeforeTargets="ResolvePackageAssets">
  <ItemGroup>
    <MergeJsonPackageReference Include="@(PackageReference)" Condition="%(Identity) == $(MSBuildThisFileName)" />
    <PackageReference Remove="@(MergeJsonPackageReference)"/>
  </ItemGroup>
</Target>

<Target Name="PasteMergeJsonPackageReference" AfterTargets="ResolvePackageAssets">
  <ItemGroup>
    <PackageReference Include="@(MergeJsonPackageReference)"/>
  </ItemGroup>
</Target>

查看 msbuild 的 (发布)PublishOnly 任务

想法:
1.msbuild 项目 -t:publishonly 是安装文件(不知道有什么用)

结果:
只执行 PublishOnly 任务没有意义

可以参考 https://docs.microsoft.com/zh-cn/visualstudio/msbuild/msbuild-targets?view=vs-2022 链接中的信息

将包发布添加成任务

无细节

0504

根据不同的 sdk 添加默认全局 using

根据以下属性判断使用使用了该sdk,然后再到导入全局 using
UsingILLinkTasksSdk
UsingMicrosoftNETSdk
UsingMicrosoftNETSdkBlazorWebAssembly
UsingMicrosoftNETSdkRazor
UsingMicrosoftNETSdkWeb
UsingMicrosoftNETSdkWorker

_MicrosoftWindowsDesktopSdkImported
_MicrosoftNETSdkWindowsDesktop

0505

添加发布当前项目包

1.在vscode中选中解决方案(.sln)文件或者项目(.csproj)文件
2.执行 "(发布当前项目或解决方案包)ReleaseNuGet Current Project Or Solution" 任务,将自动发布项目包

0512

检查 Type 的 ContainsGenericParameters 属性 是否是判断开放泛型

只要有一个类型参数没有指定特定类型就返回true

typeof(Tuple<T1,string>).ContainsGenericParameters  返回true

0521

使用 emit 动态生成 dll,然后再反编译

1.在.net framework框架中可以使用 emit 动态生成dll(程序集)
2.可以使用以下方式进行反编译
  a.使用 ildasm.exe(IL 反汇编程序) 读dll文件的中间语言指令 (不推荐,可读性不高)
  b.在vs中引用该动态生成的dll,读取反编译后的的源码 (可用,可读性可以,但是不太方便)
  c.下载 https://github.com/icsharpcode/ILSpy 链接中的工具,反编译动态生成的dll查看源码 (推荐)

0524

Easy.Extensions.DependencyInjection 的服务提供商实现 AOP

可为 DI 配置 AOP ,每一次获取服务时会触发,获取前/获取后(成员注册前)/注册完成三个事件

使用:
1.自定义一个类型继承自 Easy.Extensions.DependencyInjection.EasyServiceProviderEvents 类型
2.重写 BeforeGetService、AfterGetService、GetServiceCompleted 方法
3.将自定义的类型赋值给 EasyServiceProviderOptions.ServiceProviderEventsType
4.构建服务提供商 IServiceCollection.BuildEasyServiceProvider(EasyServiceProviderOptions);

0525

处理版本控制问题

1.版本主要在自己项目文件(.csproj)中管理
2.如果所有项目统一更新时,修改 baseConfigure.props 文件 UnifiedVersion(统一版本) 属性值为true,所有项目就会使用一个版本

修复 Easy.Extensions.DependencyInjection 事件(AOP) 传递的服务提供商类型错误问题

在 1.0.1 版本 Easy.Extensions.DependencyInjection 添加了添加事件(AOP)但是传递的服务提供商类型是默认的 serviceProviderEngineScope 类型,在1.0.2中修复

0619

解除特性继承疑惑

  • 只要特性可以搜索到,该特性的基类一定可以搜索到
  • 不管特性是否可以继承,(方法,属性 不重写)(字段 不覆盖)都可以搜索到
  • 特性可继承时:
    • 类只能从继承链上搜索到
    • 方法重写后只能从继承链上搜索到
    • (属性 重写)(字段 覆盖)后不能搜索到

0624

解决 Nuget 包会生成到项目 debug 文件中问题

  • 不想 Nuget 包中的内容生成到项目的 Debug 文件中(或一起被发布)
    • 制作 Nuget 包时设置属性"BuildOutputTargetFolder"为 lib 以外的任何文件名
    • 制作 Nuget 包时设置属性"IsTool"为 true
    • 一定要忽略"NU5128;Nu5100"警告,否者会打包失败
  • 制作 Nuget 包详细可看:https://docs.microsoft.com/zh-cn/nuget/reference/msbuild-targets

计划

  • 添加自动发布包任务 (研究) [0427]

  • 处理 vscode 自动生成的文件 (研究) [0429]

  • 研究附加进程调试(研究) [0429]

  • MergeJson 发布任务时原 json 被发布,合并的 json 没有被发布 (bug) [0429]

  • MergeJson 生成时会将 Easy.Tool.MergeJson.dll 复制到生成文件 (bug) [0430]

  • 查看 msbuild 的 (发布)PublishOnly 任务 (研究) [0501]

  • 将包发布添加成任务 (实现) [0501]

  • 根据不同的 sdk 添加默认全局 using (实现) [0504]

  • 检查 Type 的 ContainsGenericParameters 属性 是否是判断开放泛型 (实验) [0512]

  • 使用 emit 动态生成 dll,然后再反编译 (实验) [0521]

  • 了解一下动态启停 web 项目 (在 TourCar 项目中写了一个 web 管理,处理 web 项目启停) [0524]

  • 处理版本控制问题 [0525]

  • 解除特性继承疑惑 [0619]

  • 解决 Nuget 包会生成到项目 debug 文件中问题 [0624]

  • 将发布包的脚本的环境设置为发布 (实现)

  • 看看。HttpRequestRewindExtensions.EnableBuffering 的源码

  • 了解为什么应该将 IHttpContextAccessor 作为 Singleton 注入

    1.看网上解释说因为【后备存储是异步本地】,没懂是什么意思
    2.如果只是在控制器中使用的话不用注册 IHttpContextAccessor 服务,看看控制器中的httpcontext怎么来的
    
    
    可以看看
    https://github.com/aspnet/Hosting/issues/793#issuecomment-224924030
    

Easy.Extensions 项目升级/修改计划


后期计划
1.将默认类型的拓展方法分成不同的项目,步骤(在拓展面广的时候再是实现)
  a.拆分成多个项目,如:Easy.Extensions.System/Easy.Extensions.Microsoft 等等
  b.Easy.Extensions 项目只需引入所有默认类型拓展项目,这样就可按需引入和全部引入

Easy.Extensions.DependencyInjection 项目升级/修改/开发计划

bug
1.字段注入和属性每一次都会去获取新对象
2.构造函数注入的参数没有属性和字段注入

后期计划
1.添加多框架版本更换服务容器
  // 该方式是 IHostBuilder 拓展,直接配置使用 EasyDependencyInjection
  // 不同框架是 (IHostBuilder) 类型可能不同
  public static IHostBuilder UseEasyServiceProvider(this IHostBuilder hostBuilder, Action<EasyServiceProviderOptions>? optionsAction = null)
  {
      EasyServiceProviderOptions options = new();
      optionsAction?.Invoke(options);
      hostBuilder.UseServiceProviderFactory(new EasyServiceProviderFactory(options));
      return hostBuilder;
  }

2.看看 https://github.com/autofac/Autofac.AspNetCore.Multitenant 项目
  DI的多租户

Easy.Extensions.DependencyInjection.Abstractions 项目升级/修改/开发计划


Easy.Tool.MergeJson 项目升级/修改/开发计划

使用 winform 之类的项目引用 web 应用生成后的文件中没有 合并的json

不进行部署可参考
https://docs.microsoft.com/zh-cn/ef/core/what-is-new/nuget-packages#tools
Microsoft.EntityFrameworkCore.Design 包的安装方式有所不同,它不会随应用程序一起部署。 这也意味着,其类型不能在其他项目中传递使用

实现
1.使用 FindUnderPath,ConvertToAbsolutePath msbuild 任务处理文件夹路径,在程序中尽量少的处理路径

Easy.Tool.IgnoresAccessChecks 项目升级/修改/开发计划


Easy.Extensions.DynamicProxy 项目升级/修改/开发计划

开发
1.看官方项目的实现
2.需要实现的功能有:
  a.根据接口和类创建代理类型
  b.根据类实现代理类型
    I.在后期看怎么实现非虚方法的代理实现
  c.直接对对象的代理


可以看的开源项目
1.https://github.com/pamidur/aspect-injector(编译时 AOP 框架)
2.https://github.com/Jishun/RoslynWeave(编译时注入 C# 代码的目标,通过使用原始 C# 代码而不是 IL 进行编织)
3.https://github.com/vescon/MethodBoundaryAspect.Fody
4.https://github.com/htrlq/NCoreCoder.Framework(动态代理)
5.https://github.com/castleproject/Core

暂时不处理

  • 不同的项目使用一个 .vscode 文件夹 (研究)
  • IHostBuilder 添加使用 Easy.Extensions.DependencyInjection 的拓展方法 UseEasyServiceProvider

很棒的项目

对系统的集合类型进行 内存、性能 优化(池化处理)
https://github.com/jtmueller/Collections.Pooled

对文件操作优化 一个为 .NET 对象提供池MemoryStream以提高应用程序性能的库,尤其是在垃圾收集领域
https://github.com/microsoft/Microsoft.IO.RecyclableMemoryStream

24/09/30 计划

  • 将 Easy 项目的文档都整理一下,梳理一下思路
  • 修改 props/targets 文件,让包只支持 .net462 / netstandard2.0 即可 仔细了解一下 netstandard2.0/2.1 规范 netstandard2.0 : 在 .NET Framework 和所有其他平台之间共享代码 netstandard2.1 : 在 Mono、Xamarin 和 .NET Core 3.x 之间共享代码 net5.0 : 之后的共享代码,可以将 .NET 5 视为 .NET Standard vNext 支持版本 net462,netstandard2.0,netstandard2.1 ,net5+
  • 添加 Easy.Console 项目
  • .net 9 发布后处理项目 Easy.Extensions.Emit.Test ,使用 PersistedAssemblyBuilder 将 emit 生成的代码保存成 dll