.NET | 笔记 | 1

1. 合并dll与exe Costura.Fody 2. xUnit 中使用 User Secrets

2.1 添加 User Secrets

参考: ASP.NET Core 优雅的在开发环境保存机密(User Secrets) - Savorboard - 博客园 .NET Core程序中使用User Secrets存储敏感数据 - BobTian - 博客园 UserSecretsConfigurationExtensions.AddUserSecrets 方法 (Microsoft.Extensions.Configuration) | Microsoft Docs
1
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="5.0.0" />
Microsoft.Extensions.Configuration.UserSecrets 此包用于 通过 .NET Core 的配置系统访问存储在 secrets.json 文件中的数据 注意: 使用 : 分隔,而不是 .,例如: SecretsKeys:AfdianUserId 补充: 切换命令行窗口到Project程序的目录, 输入 dotnet user-secrets -h ,来查看可以使用的命令 使用 dotnet user-secrets list 列出所有的用户机密 使用 dotnet user-secrets set WeChatAppKey "X3423FEED2435DD"设置一个用户机密,其中 WebChatAppKey 为键,后面的是值。 然后使用dotnet user-secrets list来查看设置的键值对。 User Secret Manager
命令 描述 语法
clear 删除程序中所有的secrets dotnet user-secrets clear
list 列举程序中所有的secrets dotnet user-secrets list
remove 删除指定的secret dotnet user-secrets remove NameOfSecret
set 设置secret dotnet user-secrets set NameOfSecret ValueOfSecret

2.2 xUnit 中使用 依赖注入

参考: 在 Xunit 中使用依赖注入_dotNET跨平台-CSDN博客 使用 Xunit.DependencyInjection 改造测试项目 - WeihanLi - 博客园 pengweiqhca/Xunit.DependencyInjection: Use Microsoft.Extensions.DependencyInjection to resolve xUnit test cases.
1
<PackageReference Include="Xunit.DependencyInjection" Version="8.3.0" />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;


namespace Afdian.Sdk.Tests
{
public class Startup
{
public void ConfigureHost(IHostBuilder hostBuilder)
{
hostBuilder.ConfigureHostConfiguration(configurationBuilder =>
{
configurationBuilder.AddUserSecrets("0377da50-fdb8-4811-bab1-7299c2657571", true);
});
}


public void ConfigureServices(IServiceCollection services)
{
//services.AddTransient<IDependency, DependencyClass>();
}

}
}
注意: 0377da50-fdb8-4811-bab1-7299c2657571 需更改为你项目 ( Afdian.Sdk.Tests.csproj ) 中的 <UserSecretsId>0377da50-fdb8-4811-bab1-7299c2657571</UserSecretsId>

2.3 补充

Microsoft.Extensions.SecretManager.Tools 经过测试, 在 Visual Studio Enterprise 2022 中已经不需要此包, 不安装此包也可以使用 3. System.Drawing.Common 补充: .NET Core 图像处理 Image 依赖于 System.Drawing.Common 包 看上方绿线 关于 System.Drawing.Common 包 的一些问题 参考: Linux/Docker 中使用 System.Drawing.Common 踩坑小计 - AT_HUAZI - 博客园 中断性变更:仅在 Windows 上支持 System.Drawing.Common - .NET | Microsoft Docs 在 .NET 6 之前,使用 System.Drawing.Common 包不会产生任何编译时警告,也不会引发任何运行时异常。 从 .NET 6 开始,当为非 Windows 操作系统编译引用代码时,平台分析器会发出编译时警告。 此外,除非设置了配置选项,否则将引发以下运行时异常:
1
2
3
4
5
6
7
8
9
10
11
12
System.TypeInitializationException : The type initializer for 'Gdip' threw an exception.
---- System.PlatformNotSupportedException : System.Drawing.Common is not supported on non-Windows platforms. See https://aka.ms/systemdrawingnonwindows for more information.
Stack Trace:
at System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(String filename, IntPtr& bitmap)
/_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0): at System.Drawing.Bitmap..ctor(String filename, Boolean useIcm)
/_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(25,0): at System.Drawing.Bitmap..ctor(String filename)
/_/src/libraries/System.Resources.ResourceManager/tests/ResourceManagerTests.cs(270,0): at System.Resources.Tests.ResourceManagerTests.EnglishImageResourceData()+MoveNext()
/_/src/libraries/System.Linq/src/System/Linq/Select.cs(136,0): at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()
----- Inner Stack Trace -----
/_/src/libraries/System.Drawing.Common/src/System/Drawing/LibraryResolver.cs(31,0): at System.Drawing.LibraryResolver.EnsureRegistered()
/_/src/libraries/System.Drawing.Common/src/System/Drawing/GdiplusNative.Unix.cs(65,0): at System.Drawing.SafeNativeMethods.Gdip.PlatformInitialize()
/_/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs(27,0): at System.Drawing.SafeNativeMethods.Gdip..cctor()

更改原因

由于 System.Drawing.Common 被设计为 Windows 技术的精简包装器,因此其跨平台实现欠佳。 libgdiplus 是本机端 System.Drawing.Common 跨平台实现的主要提供程序。 libgdiplus 实际上是对 System.Drawing.Common 所依赖的 Windows 部分的重新实现。 该实现使 libgdiplus 成为一个重要的组件。 它大约有 30,000 行 C 代码,大部分未经测试,而且缺少很多功能。 libgdiplus 还具有许多用于图像处理和文本呈现的外部依赖项,例如 cairo、pango 和其他本机库。 这些依赖项使得维护和交付组件更具挑战性。 自从包含 Mono 跨平台实现以来,我们已将许多从未得到修复的问题重定向到 libgdiplus。 相比之下,我们采用的其他外部依赖项,例如 icu 或 openssl,都是高质量的库。 使 libgdiplus 的功能集和质量与 .NET 堆栈的其余部分相媲美是不可行的。 通过对 NuGet 包的分析,我们观察到 System.Drawing.Common 主要用于跨平台的图像处理,例如 QR 代码生成器和文本呈现。 由于我们的跨平台图形支持不完整,我们还没有注意到大量的图形使用。 System.Drawing.Common 在非 Windows 环境中的使用通常得到 SkiaSharp 和 ImageSharp 的良好支持。 System.Drawing.Common 将仅在 Windows 窗体和 GDI+ 的上下文中继续演变。

建议的操作

若要将这些 API 用于跨平台应用,请迁移到以下库之一: ImageSharp SkiaSharp Microsoft.Maui.Graphics 或者,可通过将 runtimeconfig.json 文件中的 System.Drawing.EnableUnixSupport 运行时配置开关设置为 true 来启用对非 Windows 平台的支持:
1
2
3
4
5
6
7
{
"runtimeOptions": {
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
}
添加此配置开关是为了让严重依赖此包的跨平台应用有时间迁移到更新式的库。 但是,不会修复非 Windows bug。 此外,我们可能会在未来版本中完全删除对非 Windows 平台的支持,即使你使用运行时配置切换启用它也是如此。 备注 尽管运行时开关的名称为 System.Drawing.EnableUnixSupport,但它适用于各种非 Windows 平台(如 macOS 和 Android),它们通常可被视为 Unix 风格。

SixLabors.ImageSharp

参考: SixLabors/ImageSharp: A modern, cross-platform, 2D Graphics library for .NET SixLabors.ImageSharp 实践小结 - AT_HUAZI - 博客园 4. WebRequest 等在 .NET 6 废弃 .NET 实现 自定义 AOP 参考: Net 实现自定义Aop - 陈显达 - 博客园 dotnet build --configuration Release 生成包含引用的包的dll 注意: vs 没有提示
1
2
3
<PropertyGroup>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>

方式2: 直接用 publish

1
dotnet publish --configuration Release
参考 感谢帮助! .NET 合并程序集(将 dll 合并到 exe 中) - 朱志 - 博客园 C#程序(含多个Dll)合并成一个Exe的简单方法_C#教程_脚本之家 .NET 合并程序集(将 dll 合并到 exe 中) - 朱志 - 博客园 .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖 - walterlv C# 合并dll与exe - NiTian's Blog