release:6.0.5.23

feat: 基础库增加 net8 编译项
feat: SqlHisAlarm添加表名称配置属性
refactor:  默认server gc true,如有低内存需要,更改 MSBuild 项
This commit is contained in:
Diego
2024-08-26 11:02:21 +08:00
parent b4514a5bbf
commit 8ac1952974
40 changed files with 123 additions and 76 deletions

View File

@@ -25,6 +25,11 @@ import Highlight from '@site/src/components/Highlight.js';
具体升级详情请查看链接 **https://github.com/kimdiego2098/ThingsGateway/compare/v5...master**
### 6.0.5.23
- &nbsp;<Tag>新增</Tag> 基础库增加 net8 编译项
- &nbsp;<Tag>调整</Tag> 默认server gc true如有低内存需要更改 MSBuild 项
### 6.0.5.21

View File

@@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<NoWarn>CS8603;CS8618;CS1591;CS8625;CS8602;CS8604;CS8600;CS8601;</NoWarn>
<TargetFrameworks>net6.0;</TargetFrameworks>
<TargetFrameworks>net6.0;net8.0;</TargetFrameworks>
<LangVersion>12.0</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

View File

@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<TargetFrameworks>net462;netstandard2.0;net6.0;</TargetFrameworks>
<TargetFrameworks>net462;netstandard2.0;net6.0;net8.0;</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<Content Remove="Locales\*.json" />

View File

@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<TargetFrameworks>net6.0;</TargetFrameworks>
<TargetFrameworks>net6.0;net8.0;</TargetFrameworks>
</PropertyGroup>
<ItemGroup>

View File

@@ -57,7 +57,7 @@ public partial class ParentMenu
{
Option = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Size = Size.ExtraLarge,
Title = Localizer["ChoiceMenu"],
BodyTemplate = BootstrapDynamicComponent.CreateComponent<ParentMenuTree>(new Dictionary<string, object?>

View File

@@ -37,7 +37,7 @@ public partial class SysResourceEdit
private Task OnToggleIconDialog() => DialogService.Show(new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = Localizer["ChoiceIcon"],
ShowFooter = false,
Component = BootstrapDynamicComponent.CreateComponent<MenuIconList>(new Dictionary<string, object?>()

View File

@@ -69,7 +69,7 @@ public partial class SysRolePage
ids.AddRange(hasResources.Select(a => a.ApiUrl));
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Size = Size.ExtraLarge,
Title = OperDescLocalizer["RoleGrantApiPermission"],
ShowCloseButton = false,
@@ -88,7 +88,7 @@ public partial class SysRolePage
var ids = (await SysRoleService.OwnResourceAsync(id))?.GrantInfoList;
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Size = Size.ExtraLarge,
Title = OperDescLocalizer["RoleGrantResource"],
ShowCloseButton = false,
@@ -106,7 +106,7 @@ public partial class SysRolePage
{
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = OperDescLocalizer["RoleGrantUser"],
ShowFooter = false,
ShowCloseButton = false,

View File

@@ -41,7 +41,7 @@ public partial class SessionPage
{
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = Localizer[nameof(VerificatInfo)],
ShowFooter = false,
Size = Size.ExtraLarge

View File

@@ -52,7 +52,7 @@ public partial class SysUserPage
ids.AddRange(hasResources.Select(a => a.ApiUrl));
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Size = Size.ExtraLarge,
Title = OperDescLocalizer["UserGrantApiPermission"],
ShowCloseButton = false,
@@ -70,7 +70,7 @@ public partial class SysUserPage
var ids = (await SysUserService.OwnResourceAsync(id))?.GrantInfoList;
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Size = Size.ExtraLarge,
Title = OperDescLocalizer["UserGrantResource"],
ShowCloseButton = false,
@@ -87,7 +87,7 @@ public partial class SysUserPage
{
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = OperDescLocalizer["UserGrantRole"],
ShowFooter = false,
ShowCloseButton = false,

View File

@@ -198,7 +198,7 @@ public abstract class BusinessBaseWithCacheIntervalAlarmModel<VarModel, DevModel
}
/// <summary>
/// 当设备状态发生变化时触发此事件处理方法。该方法内部会检查是否需要进行设备上传,如果需要,则调用 <see cref="DeviceChange(DeviceRunTime, DeviceData)"/> 方法。
/// 当设备状态发生变化时触发此事件处理方法。该方法内部会检查是否需要进行设备上传,如果需要,则调用 <see cref="DeviceChange(DeviceRunTime, DeviceBasicData)"/> 方法。
/// </summary>
/// <param name="deviceRunTime">设备运行时信息</param>
/// <param name="deviceData">设备数据</param>
@@ -216,7 +216,7 @@ public abstract class BusinessBaseWithCacheIntervalAlarmModel<VarModel, DevModel
}
/// <summary>
/// 当变量值发生变化时触发此事件处理方法。该方法内部会检查是否需要进行变量上传,如果需要,则调用 <see cref="VariableChange(VariableRunTime, VariableData)"/> 方法。
/// 当变量值发生变化时触发此事件处理方法。该方法内部会检查是否需要进行变量上传,如果需要,则调用 <see cref="VariableChange(VariableRunTime, VariableBasicData)"/> 方法。
/// </summary>
/// <param name="variableRunTime">变量运行时信息</param>
/// <param name="variable">变量数据</param>

View File

@@ -357,6 +357,26 @@ public class ChannelThread
driverBase.AfterStop();
// 如果需要移除的是采集设备
if (IsCollectChannel)
{
// 锁定采集设备集合并移除与DriverBases关联的设备
//lock (GlobalData.CollectDevices)
{
GlobalData.CollectDevices.RemoveWhere(it => DriverBases.Any(a => a.DeviceId == it.Value.Id));
GlobalData.Variables.RemoveWhere(it => DriverBases.Any(a => a.DeviceId == it.Value.DeviceId));
}
}
else
{
// 锁定业务设备集合并移除与DriverBases关联的设备
//lock (GlobalData.BusinessDevices)
{
GlobalData.BusinessDevices.RemoveWhere(it => DriverBases.Any(a => a.DeviceId == it.Value.Id));
}
}
// 从驱动程序集合和令牌源集合中移除驱动程序对象和相关令牌
DriverBases.Remove(driverBase);
CancellationTokenSources.Remove(deviceId);
@@ -493,7 +513,7 @@ public class ChannelThread
if (IsCollectChannel)
{
// 锁定采集设备集合并移除与DriverBases关联的设备
lock (GlobalData.CollectDevices)
//lock (GlobalData.CollectDevices)
{
GlobalData.CollectDevices.RemoveWhere(it => DriverBases.Any(a => a.DeviceId == it.Value.Id));
GlobalData.Variables.RemoveWhere(it => DriverBases.Any(a => a.DeviceId == it.Value.DeviceId));
@@ -502,7 +522,7 @@ public class ChannelThread
else
{
// 锁定业务设备集合并移除与DriverBases关联的设备
lock (GlobalData.BusinessDevices)
//lock (GlobalData.BusinessDevices)
{
GlobalData.BusinessDevices.RemoveWhere(it => DriverBases.Any(a => a.DeviceId == it.Value.Id));
}

View File

@@ -137,7 +137,7 @@ public abstract class CollectBase : DriverBase
DeviceMethods = data;
// 使用全局锁确保多线程安全地更新全局数据
lock (GlobalData.CollectDevices)
//lock (GlobalData.CollectDevices)
{
// 从全局设备字典中移除具有相同 Id 的设备
GlobalData.CollectDevices.RemoveWhere(it => it.Value.Id == device.Id);

View File

@@ -13,7 +13,6 @@ using BootstrapBlazor.Components;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using ThingsGateway.Core.Extension;
using ThingsGateway.NewLife.X.Threading;
using TouchSocket.Core;
@@ -213,24 +212,24 @@ public abstract class DriverBase : DisposableObject
this.SafeDispose();
// 根据是否正在采集设备来从全局设备集合或业务设备集合中移除指定设备ID的驱动程序对象
//if (!HostedServiceUtil.ManagementHostedService.StartBusinessDeviceEnable)
{
if (IsCollectDevice)
{
lock (GlobalData.CollectDevices)
{
GlobalData.CollectDevices.RemoveWhere(it => it.Value.Id == DeviceId);
//{
// if (IsCollectDevice)
// {
// lock (GlobalData.CollectDevices)
// {
// GlobalData.CollectDevices.RemoveWhere(it => it.Value.Id == DeviceId);
GlobalData.Variables.RemoveWhere(it => it.Value.DeviceId == DeviceId);
}
}
else
{
lock (GlobalData.BusinessDevices)
{
GlobalData.BusinessDevices.RemoveWhere(it => it.Value.Id == DeviceId);
}
}
}
// GlobalData.Variables.RemoveWhere(it => it.Value.DeviceId == DeviceId);
// }
// }
// else
// {
// lock (GlobalData.BusinessDevices)
// {
// GlobalData.BusinessDevices.RemoveWhere(it => it.Value.Id == DeviceId);
// }
// }
//}
IsInitSuccess = true;
IsBeforStarted = false;

View File

@@ -67,7 +67,7 @@ public partial class ChannelPage : IDisposable
{
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = DefaultLocalizer["BatchEdit"],
ShowFooter = false,
ShowCloseButton = false,
@@ -151,7 +151,7 @@ public partial class ChannelPage : IDisposable
{
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = Localizer["ImportExcel"],
ShowFooter = false,
ShowCloseButton = false,

View File

@@ -99,7 +99,7 @@ public partial class DeviceEditComponent
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = ChannelLocalizer["SaveChannel"],
ShowFooter = false,
ShowCloseButton = false,
@@ -243,7 +243,7 @@ public partial class DeviceEditComponent
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = Localizer["Check"],
ShowFooter = false,

View File

@@ -144,7 +144,7 @@ public abstract partial class DevicePage : IDisposable
{
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = DefaultLocalizer["BatchEdit"],
ShowFooter = false,
ShowCloseButton = false,
@@ -251,7 +251,7 @@ public abstract partial class DevicePage : IDisposable
{
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = Localizer["ImportExcel"],
ShowFooter = false,
ShowCloseButton = false,

View File

@@ -59,7 +59,7 @@ public partial class PluginPage
{
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = PluginAddInputLoaclozer["SavePlugin"],
ShowFooter = false,
ShowCloseButton = false,

View File

@@ -107,7 +107,7 @@ public partial class VariablePage : IDisposable
{
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = DefaultLocalizer["BatchEdit"],
ShowFooter = false,
ShowCloseButton = false,
@@ -208,7 +208,7 @@ public partial class VariablePage : IDisposable
{
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = Localizer["ImportExcel"],
ShowFooter = false,
ShowCloseButton = false,

View File

@@ -63,7 +63,7 @@ public partial class DeviceStatus
}
await DialogService.Show(new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = _driverBaseItem.DeviceName,
Component = BootstrapDynamicComponent.CreateComponent(driver, new Dictionary<string, object?>()
{

View File

@@ -9,8 +9,11 @@
<ApplicationIcon>favicon.ico</ApplicationIcon>
<TargetFrameworks>net6.0;</TargetFrameworks>
<!--<PublishAot>true</PublishAot>-->
<!--动态适用GC-->
<GarbageCollectionAdaptationMode>true</GarbageCollectionAdaptationMode>
<!--使用工作站GC-->
<ServerGarbageCollection>false</ServerGarbageCollection>
<!--<ServerGarbageCollection>false</ServerGarbageCollection>-->
<!--<PlatformTarget>x86</PlatformTarget>-->
</PropertyGroup>

View File

@@ -61,7 +61,7 @@ public partial class MainLayout : IDisposable
op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Size = Size.ExtraLarge,
ShowFooter = false,
Title = Localizer["ChoiceModule"],
@@ -91,7 +91,7 @@ public partial class MainLayout : IDisposable
{
return DialogService.Show(new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = Localizer["UserCenter"],
ShowFooter = false,
Component = BootstrapDynamicComponent.CreateComponent<UserCenterPage>(new Dictionary<string, object?>()
@@ -213,7 +213,7 @@ public partial class MainLayout : IDisposable
op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Size = Size.Medium,
ShowFooter = false,
Title = Localizer["About"],

View File

@@ -14,7 +14,7 @@
<!--<UseWindowsThreadPool>false</UseWindowsThreadPool> -->
<!--使用工作站GC-->
<ServerGarbageCollection>false</ServerGarbageCollection>
<!--<ServerGarbageCollection>false</ServerGarbageCollection>-->
<!--<PlatformTarget>x86</PlatformTarget>-->
</PropertyGroup>
@@ -66,7 +66,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.8" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.8" />
</ItemGroup>
<!--安装服务守护-->

View File

@@ -9,8 +9,10 @@
<ApplicationIcon>favicon.ico</ApplicationIcon>
<TargetFrameworks>net8.0-windows;</TargetFrameworks>
<!--动态适用GC-->
<GarbageCollectionAdaptationMode>true</GarbageCollectionAdaptationMode>
<!--使用工作站GC-->
<ServerGarbageCollection>false</ServerGarbageCollection>
<!--<ServerGarbageCollection>false</ServerGarbageCollection>-->
<!--<PlatformTarget>x86</PlatformTarget>-->
</PropertyGroup>

View File

@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>6.0.5.21</Version>
<Version>6.0.5.23</Version>
</PropertyGroup>
<ItemGroup>

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0;</TargetFrameworks>
<TargetFrameworks>net8.0;</TargetFrameworks>
<OutputType>Exe</OutputType>
</PropertyGroup>

View File

@@ -3,7 +3,7 @@
<Import Project="$(SolutionDir)PackNuget.props" />
<Import Project="$(SolutionDir)Version.props" />
<PropertyGroup>
<TargetFrameworks>net462;netstandard2.0;net6.0;</TargetFrameworks>
<TargetFrameworks>net462;netstandard2.0;net6.0;net8.0;</TargetFrameworks>
<Description>工业设备通讯协议-OpcDa协议</Description>
<DocumentationFile></DocumentationFile>
<IncludeSymbols>false</IncludeSymbols>

View File

@@ -4,7 +4,7 @@
<Import Project="$(SolutionDir)PackNuget.props" />
<Import Project="$(SolutionDir)Version.props" />
<PropertyGroup>
<TargetFrameworks>net48;netstandard2.1;net6.0;</TargetFrameworks>
<TargetFrameworks>net48;netstandard2.1;net6.0;net8.0;</TargetFrameworks>
<Description>工业设备通讯协议-OpcUa协议</Description>
<DocumentationFile></DocumentationFile>
</PropertyGroup>

View File

@@ -2,7 +2,7 @@
<Import Project="$(SolutionDir)PackNuget.props" />
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net6.0;</TargetFrameworks>
<TargetFrameworks>netstandard2.0;net6.0;net8.0;</TargetFrameworks>
<Version>8.8.9</Version>
</PropertyGroup>

View File

@@ -5,6 +5,14 @@
<OutputType>WinExe</OutputType>
<ApplicationIcon>favicon.ico</ApplicationIcon>
<TargetFrameworks>net6.0</TargetFrameworks>
<!--动态适用GC-->
<GarbageCollectionAdaptationMode>true</GarbageCollectionAdaptationMode>
<!--使用自托管线程池-->
<!--<UseWindowsThreadPool>false</UseWindowsThreadPool> -->
<!--使用工作站GC-->
<!--<ServerGarbageCollection>false</ServerGarbageCollection>-->
</PropertyGroup>

View File

@@ -70,7 +70,7 @@ public partial class MainLayout
op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Size = Size.Medium,
ShowFooter = false,
Title = Localizer["About"],

View File

@@ -15,7 +15,7 @@
<!--<UseWindowsThreadPool>false</UseWindowsThreadPool> -->
<!--使用工作站GC-->
<ServerGarbageCollection>false</ServerGarbageCollection>
<!--<ServerGarbageCollection>false</ServerGarbageCollection>-->
<!--<PlatformTarget>x86</PlatformTarget>-->
</PropertyGroup>

View File

@@ -22,12 +22,12 @@ public partial class HisAlarmPage : IDriverUIBase
[Parameter, EditorRequired]
public object Driver { get; set; }
public SqlHisAlarm QuestDBProducer => (SqlHisAlarm)Driver;
public SqlHisAlarm SqlHisAlarmProducer => (SqlHisAlarm)Driver;
private HistoryAlarmPageInput CustomerSearchModel { get; set; } = new();
private async Task<QueryData<HistoryAlarm>> OnQueryAsync(QueryPageOptions options)
{
var query = await QuestDBProducer.QueryData(options);
var query = await SqlHisAlarmProducer.QueryData(options);
return query;
}
}

View File

@@ -28,4 +28,8 @@ public class SqlHisAlarmProperty : BusinessPropertyWithCache
[Required]
[AutoGenerateColumn(ComponentType = typeof(Textarea), Rows = 1)]
public string BigTextConnectStr { get; set; } = "server=.;uid=sa;pwd=111111;database=test;";
[DynamicProperty]
public string TableName { get; set; } = "historyAlarm";
}

View File

@@ -61,9 +61,9 @@ public partial class SqlHisAlarm : BusinessBaseWithCacheVarModel<HistoryAlarm>,
protected override Task ProtectedBeforStartAsync(CancellationToken cancellationToken)
{
var db = BusinessDatabaseUtil.GetDb(_driverPropertys.DbType, _driverPropertys.BigTextConnectStr);
using var db = BusinessDatabaseUtil.GetDb(_driverPropertys.DbType, _driverPropertys.BigTextConnectStr);
db.DbMaintenance.CreateDatabase();
db.CodeFirst.InitTables(typeof(HistoryAlarm));
db.CodeFirst.As<HistoryAlarm>(_driverPropertys.TableName).InitTables<HistoryAlarm>();
return base.ProtectedBeforStartAsync(cancellationToken);
}
@@ -91,7 +91,7 @@ public partial class SqlHisAlarm : BusinessBaseWithCacheVarModel<HistoryAlarm>,
internal ISugarQueryable<HistoryAlarm> Query(DBHistoryAlarmPageInput input)
{
using var db = BusinessDatabaseUtil.GetDb(_driverPropertys.DbType, _driverPropertys.BigTextConnectStr);
var query = db.Queryable<HistoryAlarm>().SplitTable()
var query = db.Queryable<HistoryAlarm>().AS(_driverPropertys.TableName)
.WhereIF(input.StartTime != null, a => a.EventTime >= input.StartTime)
.WhereIF(input.EndTime != null, a => a.EventTime <= input.EndTime)
.WhereIF(!string.IsNullOrEmpty(input.VariableName), it => it.Name.Contains(input.VariableName))
@@ -119,7 +119,7 @@ public partial class SqlHisAlarm : BusinessBaseWithCacheVarModel<HistoryAlarm>,
IsSearch = option.Searches.Any()
};
var query = db.GetQuery<HistoryAlarm>(option);
var query = db.GetQuery<HistoryAlarm>(option).AS(_driverPropertys.TableName);
if (option.IsPage)
{

View File

@@ -44,9 +44,9 @@ public partial class SqlHisAlarm : BusinessBaseWithCacheVarModel<HistoryAlarm>
//.SplitTable()
if (db.CurrentConnectionConfig.DbType == SqlSugar.DbType.QuestDB)
result = await db.Insertable(dbInserts).UseParameter().ExecuteCommandAsync().ConfigureAwait(false);//不要加分表
result = await db.Insertable(dbInserts).AS(_driverPropertys.TableName).UseParameter().ExecuteCommandAsync().ConfigureAwait(false);//不要加分表
else
result = await db.Fastest<HistoryAlarm>().PageSize(50000).BulkCopyAsync(dbInserts).ConfigureAwait(false);
result = await db.Fastest<HistoryAlarm>().AS(_driverPropertys.TableName).PageSize(50000).BulkCopyAsync(dbInserts).ConfigureAwait(false);
//var result = await db.Insertable(dbInserts).SplitTable().ExecuteCommandAsync().ConfigureAwait(false);
if (result > 0)

View File

@@ -141,7 +141,7 @@ public partial class OpcDaMaster : IDisposable
{
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = OpcDaPropertyLocalizer["ShowImport"],
ShowFooter = false,
ShowCloseButton = false,

View File

@@ -140,7 +140,7 @@ public partial class OpcUaMaster : IDisposable
{
var op = new DialogOption()
{
IsScrolling = true,
IsScrolling = false,
Title = OpcUaPropertyLocalizer["ShowImport"],
ShowFooter = false,
ShowCloseButton = false,

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="$(SolutionDir)Version.props" />
<Import Project="$(SolutionDir)PackNuget.props" />
<PropertyGroup>
<OpenApiGenerateDocuments>false</OpenApiGenerateDocuments>
</PropertyGroup>
@@ -10,12 +10,19 @@
<None Remove="SpecificationDocument\Assets\index.html" />
<EmbeddedResource Include="SpecificationDocument\Assets\index.html" />
</ItemGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<ProjectReference Include="$(SolutionDir)\tools\ThingsGateway.Startup\ThingsGateway.Startup.csproj" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.32" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.7.2" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='net8.0'">
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.8" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='net6.0'">
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.32" />
</ItemGroup>
</Project>

View File

@@ -2,7 +2,7 @@
<Import Project="$(SolutionDir)PackNuget.props" />
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net6.0;</TargetFrameworks>
<TargetFrameworks>netstandard2.0;net6.0;net8.0;</TargetFrameworks>
<Version>8.8.9</Version>
</PropertyGroup>

View File

@@ -4,10 +4,10 @@
<Import Project="$(SolutionDir)Version.props" />
<PropertyGroup>
<TargetFrameworks>net462;netstandard2.0;netstandard2.1;net6.0;</TargetFrameworks>
<TargetFrameworks>net462;netstandard2.0;netstandard2.1;net6.0;net8.0;</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFramework)'=='net462' or '$(TargetFramework)'=='net6.0-windows'">
<PropertyGroup Condition=" '$(TargetFramework)'=='net462' or '$(TargetFramework)'=='net6.0-windows' or '$(TargetFramework)'=='net8.0-windows'">
<DefineConstants>$(DefineConstants);__WIN__</DefineConstants>
</PropertyGroup>