2 Commits

Author SHA1 Message Date
Developer01
79166a582c ?? 2026-09-22 16:40:36 +02:00
Developer01
89bef56773 Neues Formular für App-Service-Monitor hinzugefügt
Ein neues Formular `frmAdmin_AppserviceTest` wurde hinzugefügt, das als Monitor für den EDMI-App-Service dient. Es ermöglicht die Überprüfung des Service-Status, das Starten/Stoppen von Lasttests und die Protokollierung von Verbindungs- und Datenbankoperationen.

Weitere Änderungen:
- Sichtbarkeitslogik für `bbtnitm_Appservice` in `frmMain` implementiert.
- Logging-Schwellenwerte in `frmMain` angepasst (5000ms/5500ms).
- Datenbankabfragen in `frmValidator` optimiert und Debug-Logs hinzugefügt.
- Ressourcen-Referenzen in mehreren UI-Komponenten entfernt oder optimiert.
- Projektdatei `taskFLOW.vbproj` aktualisiert, um neue Ressourcen und Abhängigkeiten einzubinden.
2026-09-22 16:40:25 +02:00
11 changed files with 3569 additions and 4330 deletions

View File

@@ -7,6 +7,8 @@ Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "SetupVS19", "SetupVS19\Setu
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "taskFLOW", "TaskFlow\taskFLOW.vbproj", "{6ACA1432-09A2-47EF-A704-C0AA73905756}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EDMI.API", "..\..\..\2_DLL Projekte\DDModules\EDMIAPI\EDMI.API.vbproj", "{25017513-0D97-49D3-98D7-BA76D9B251B0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
CD_ROM|Any CPU = CD_ROM|Any CPU
@@ -61,6 +63,26 @@ Global
{6ACA1432-09A2-47EF-A704-C0AA73905756}.SingleImage|Any CPU.Build.0 = Release|x86
{6ACA1432-09A2-47EF-A704-C0AA73905756}.SingleImage|x86.ActiveCfg = Debug|x86
{6ACA1432-09A2-47EF-A704-C0AA73905756}.SingleImage|x86.Build.0 = Debug|x86
{25017513-0D97-49D3-98D7-BA76D9B251B0}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.CD_ROM|Any CPU.Build.0 = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.CD_ROM|x86.ActiveCfg = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.CD_ROM|x86.Build.0 = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.Debug|x86.ActiveCfg = Debug|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.Debug|x86.Build.0 = Debug|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.DVD-5|Any CPU.ActiveCfg = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.DVD-5|Any CPU.Build.0 = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.DVD-5|x86.ActiveCfg = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.DVD-5|x86.Build.0 = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.Release|Any CPU.Build.0 = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.Release|x86.ActiveCfg = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.Release|x86.Build.0 = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.SingleImage|Any CPU.Build.0 = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.SingleImage|x86.ActiveCfg = Release|Any CPU
{25017513-0D97-49D3-98D7-BA76D9B251B0}.SingleImage|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -80,16 +80,16 @@ Public Class ClassInit
If CONFIG.Config.EDMIAppServer <> String.Empty Then
Try
LOGGER.Info($"Configuration EDMIAppServer [{CONFIG.Config.EDMIAppServer}] will be used...")
_EDMIClient = New Client(LOGCONFIG, CONFIG.Config.EDMIAppServer)
_EDMIClient = New Client(LOGCONFIG, CONFIG.Config.EDMIAppServer, Environment.UserName)
If Not IsNothing(_EDMIClient) Then
If _EDMIClient.Connect() Then
EDMIAppServerActive = True
EDMIService.Client = _EDMIClient
EDMIService.Address = CONFIG.Config.EDMIAppServer
LOGGER.Info($"EDMIAppServer [{CONFIG.Config.EDMIAppServer}] is active!")
LOGGER.Info($"✔✔ EDMIAppServer [{CONFIG.Config.EDMIAppServer}] is active!")
Else
LOGGER.Warn($"#### ⚠️ !!! Could not Connect to APPServer [{CONFIG.Config.EDMIAppServer}]!!! ###")
LOGGER.Warn($"⚠️ Could not Connect to APPServer [{CONFIG.Config.EDMIAppServer}]!!! ###")
End If
End If
Catch ex As Exception

View File

@@ -551,6 +551,12 @@
<Compile Include="frmAdminPasswort.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="frmAdmin_AppserviceTest.Designer.vb">
<DependentUpon>frmAdmin_AppserviceTest.vb</DependentUpon>
</Compile>
<Compile Include="frmAdmin_AppserviceTest.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="frmAdmin_notResponsibleConfig.Designer.vb">
<DependentUpon>frmAdmin_notResponsibleConfig.vb</DependentUpon>
</Compile>
@@ -837,6 +843,9 @@
<DependentUpon>frmAdminPasswort.vb</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="frmAdmin_AppserviceTest.resx">
<DependentUpon>frmAdmin_AppserviceTest.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="frmAdmin_notResponsibleConfig.resx">
<DependentUpon>frmAdmin_notResponsibleConfig.vb</DependentUpon>
<SubType>Designer</SubType>

View File

@@ -0,0 +1,164 @@
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class frmAdmin_AppserviceTest
Inherits DevExpress.XtraEditors.XtraForm
'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Wird vom Windows Form-Designer benötigt.
Private components As System.ComponentModel.IContainer
'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmAdmin_AppserviceTest))
Me.SimpleButton1 = New DevExpress.XtraEditors.SimpleButton()
Me.lblServiceOnline = New DevExpress.XtraEditors.LabelControl()
Me.lblAppServiceOffline = New DevExpress.XtraEditors.LabelControl()
Me.btnLoadStart = New DevExpress.XtraEditors.SimpleButton()
Me.btnLoadStop = New DevExpress.XtraEditors.SimpleButton()
Me.ListBoxControl1 = New DevExpress.XtraEditors.ListBoxControl()
Me.ListBoxControl2 = New DevExpress.XtraEditors.ListBoxControl()
Me.LabelControl1 = New DevExpress.XtraEditors.LabelControl()
Me.NumericUpDown1 = New System.Windows.Forms.NumericUpDown()
CType(Me.ListBoxControl1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.ListBoxControl2, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.NumericUpDown1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'SimpleButton1
'
Me.SimpleButton1.Location = New System.Drawing.Point(12, 1)
Me.SimpleButton1.Name = "SimpleButton1"
Me.SimpleButton1.Size = New System.Drawing.Size(196, 32)
Me.SimpleButton1.TabIndex = 1
Me.SimpleButton1.Text = "Prüfe Status EDMI Service"
'
'lblServiceOnline
'
Me.lblServiceOnline.ImageAlignToText = DevExpress.XtraEditors.ImageAlignToText.LeftCenter
Me.lblServiceOnline.ImageOptions.Alignment = System.Drawing.ContentAlignment.MiddleLeft
Me.lblServiceOnline.ImageOptions.SvgImage = CType(resources.GetObject("lblServiceOnline.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.lblServiceOnline.Location = New System.Drawing.Point(12, 39)
Me.lblServiceOnline.Name = "lblServiceOnline"
Me.lblServiceOnline.Size = New System.Drawing.Size(240, 36)
Me.lblServiceOnline.TabIndex = 3
Me.lblServiceOnline.Text = "AppService online and Functions all normal"
Me.lblServiceOnline.Visible = False
'
'lblAppServiceOffline
'
Me.lblAppServiceOffline.ImageAlignToText = DevExpress.XtraEditors.ImageAlignToText.LeftCenter
Me.lblAppServiceOffline.ImageOptions.Alignment = System.Drawing.ContentAlignment.MiddleLeft
Me.lblAppServiceOffline.ImageOptions.SvgImage = CType(resources.GetObject("lblAppServiceOffline.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.lblAppServiceOffline.Location = New System.Drawing.Point(12, 39)
Me.lblAppServiceOffline.Name = "lblAppServiceOffline"
Me.lblAppServiceOffline.Size = New System.Drawing.Size(183, 36)
Me.lblAppServiceOffline.TabIndex = 4
Me.lblAppServiceOffline.Text = "AppService not in proper mode"
Me.lblAppServiceOffline.Visible = False
'
'btnLoadStart
'
Me.btnLoadStart.Location = New System.Drawing.Point(12, 150)
Me.btnLoadStart.Name = "btnLoadStart"
Me.btnLoadStart.Size = New System.Drawing.Size(250, 38)
Me.btnLoadStart.TabIndex = 5
Me.btnLoadStart.Text = "Starte Performance-Test " & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "(parallele Verbindungen und Databasefallbacks)"
'
'btnLoadStop
'
Me.btnLoadStop.Location = New System.Drawing.Point(12, 223)
Me.btnLoadStop.Name = "btnLoadStop"
Me.btnLoadStop.Size = New System.Drawing.Size(250, 32)
Me.btnLoadStop.TabIndex = 6
Me.btnLoadStop.Text = "Stoppe Perf-Test"
Me.btnLoadStop.Visible = False
'
'ListBoxControl1
'
Me.ListBoxControl1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.ListBoxControl1.Location = New System.Drawing.Point(286, 1)
Me.ListBoxControl1.Name = "ListBoxControl1"
Me.ListBoxControl1.Size = New System.Drawing.Size(420, 132)
Me.ListBoxControl1.TabIndex = 7
'
'ListBoxControl2
'
Me.ListBoxControl2.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.ListBoxControl2.Location = New System.Drawing.Point(286, 150)
Me.ListBoxControl2.Name = "ListBoxControl2"
Me.ListBoxControl2.Size = New System.Drawing.Size(419, 105)
Me.ListBoxControl2.TabIndex = 8
'
'LabelControl1
'
Me.LabelControl1.Location = New System.Drawing.Point(12, 197)
Me.LabelControl1.Name = "LabelControl1"
Me.LabelControl1.Size = New System.Drawing.Size(143, 13)
Me.LabelControl1.TabIndex = 10
Me.LabelControl1.Text = "Anzahl parallele Verbindungen"
'
'NumericUpDown1
'
Me.NumericUpDown1.Font = New System.Drawing.Font("Segoe UI", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.NumericUpDown1.Increment = New Decimal(New Integer() {50, 0, 0, 0})
Me.NumericUpDown1.Location = New System.Drawing.Point(208, 192)
Me.NumericUpDown1.Maximum = New Decimal(New Integer() {1000, 0, 0, 0})
Me.NumericUpDown1.Minimum = New Decimal(New Integer() {100, 0, 0, 0})
Me.NumericUpDown1.Name = "NumericUpDown1"
Me.NumericUpDown1.Size = New System.Drawing.Size(54, 22)
Me.NumericUpDown1.TabIndex = 11
Me.NumericUpDown1.Value = New Decimal(New Integer() {100, 0, 0, 0})
'
'frmAdmin_AppserviceTest
'
Me.Appearance.Options.UseFont = True
Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 17.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(717, 267)
Me.Controls.Add(Me.NumericUpDown1)
Me.Controls.Add(Me.LabelControl1)
Me.Controls.Add(Me.ListBoxControl2)
Me.Controls.Add(Me.ListBoxControl1)
Me.Controls.Add(Me.btnLoadStop)
Me.Controls.Add(Me.btnLoadStart)
Me.Controls.Add(Me.lblAppServiceOffline)
Me.Controls.Add(Me.lblServiceOnline)
Me.Controls.Add(Me.SimpleButton1)
Me.Font = New System.Drawing.Font("Segoe UI", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.IconOptions.SvgImage = CType(resources.GetObject("frmAdmin_AppserviceTest.IconOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.Margin = New System.Windows.Forms.Padding(4)
Me.Name = "frmAdmin_AppserviceTest"
Me.Text = "AppService Monitor"
CType(Me.ListBoxControl1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.ListBoxControl2, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.NumericUpDown1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents SimpleButton1 As DevExpress.XtraEditors.SimpleButton
Friend WithEvents lblServiceOnline As DevExpress.XtraEditors.LabelControl
Friend WithEvents lblAppServiceOffline As DevExpress.XtraEditors.LabelControl
Friend WithEvents btnLoadStart As DevExpress.XtraEditors.SimpleButton
Friend WithEvents btnLoadStop As DevExpress.XtraEditors.SimpleButton
Friend WithEvents ListBoxControl1 As DevExpress.XtraEditors.ListBoxControl
Friend WithEvents ListBoxControl2 As DevExpress.XtraEditors.ListBoxControl
Friend WithEvents LabelControl1 As DevExpress.XtraEditors.LabelControl
Friend WithEvents NumericUpDown1 As NumericUpDown
End Class

View File

@@ -0,0 +1,181 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="DevExpress.Data.v21.2" name="DevExpress.Data.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<data name="lblServiceOnline.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAKMCAAAC77u/
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku
WWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQoJLkdyZWVue2ZpbGw6IzAz
OUMyMzt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
Y2l0eTowLjc1O30KCS5zdDF7b3BhY2l0eTowLjU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQo8L3N0eWxl
Pg0KICA8ZyBpZD0iQ2hlY2tCb3giPg0KICAgIDxwYXRoIGQ9Ik0yNyw0SDVDNC41LDQsNCw0LjUsNCw1
djIyYzAsMC41LDAuNSwxLDEsMWgyMmMwLjUsMCwxLTAuNSwxLTFWNUMyOCw0LjUsMjcuNSw0LDI3LDR6
IE0xNCwyMmwtNi02bDItMmw0LDQgICBsOC04bDIsMkwxNCwyMnoiIGNsYXNzPSJHcmVlbiIgLz4NCiAg
PC9nPg0KPC9zdmc+Cw==
</value>
</data>
<data name="lblAppServiceOffline.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAANcCAAAC77u/
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z
ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5CbGFja3tmaWxsOiM3MjcyNzI7fQoJLkdyZWVue2ZpbGw6IzAz
OUMyMzt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9Cgkuc3Qwe29wYWNpdHk6MC43NTt9Cgkuc3Qxe29wYWNp
dHk6MC41O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkZvcmJpZCI+DQogICAgPHBhdGggZD0iTTE2LDRDOS40
LDQsNCw5LjQsNCwxNnM1LjQsMTIsMTIsMTJzMTItNS40LDEyLTEyUzIyLjYsNCwxNiw0eiBNMTYsOGMx
LjUsMCwyLjksMC40LDQuMSwxLjFsLTExLDExICAgQzguNCwxOC45LDgsMTcuNSw4LDE2QzgsMTEuNiwx
MS42LDgsMTYsOHogTTE2LDI0Yy0xLjUsMC0yLjgtMC40LTQtMS4xTDIyLjksMTJjMC43LDEuMiwxLjEs
Mi41LDEuMSw0QzI0LDIwLjQsMjAuNCwyNCwxNiwyNHoiIGNsYXNzPSJSZWQiIC8+DQogIDwvZz4NCjwv
c3ZnPgs=
</value>
</data>
<data name="frmAdmin_AppserviceTest.IconOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAABEDAAAC77u/
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
Y2U9InByZXNlcnZlIiBpZD0iU3RhdGlzdGljYWwiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcg
MCAwIDMyIDMyIj4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5HcmVlbntmaWxsOiMwMzlDMjM7
fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQo8L3N0eWxlPg0KICA8
cGF0aCBkPSJNNiwxM2MwLTEuNywxLjMtMywzLTNoMTNWNEgzQzIuNCw0LDIsMy42LDIsM2MwLTAuNiww
LjQtMSwxLTFoMTlWMWMwLTAuNi0wLjQtMS0xLTFIM0MxLjMsMCwwLDEuMywwLDN2MjAgIGMwLDEuNywx
LjMsMywzLDNoM1YxM3oiIGNsYXNzPSJCbHVlIiAvPg0KICA8cGF0aCBkPSJNMzEsMTJIOWMtMC41LDAt
MSwwLjUtMSwxdjE4YzAsMC41LDAuNSwxLDEsMWgyMmMwLjUsMCwxLTAuNSwxLTFWMTNDMzIsMTIuNSwz
MS41LDEyLDMxLDEyeiBNMzAsMzBIMTBWMTRoMjAgIFYzMHoiIGNsYXNzPSJCbGFjayIgLz4NCiAgPHBv
bHlnb24gcG9pbnRzPSIxMi43LDI3LjEgMTEuMywyNS43IDE3LDIwIDIwLDIzIDI1LDE4IDI4LjcsMjEu
NyAyNy4zLDIzLjEgMjUsMjAuOCAyMCwyNS44IDE3LDIyLjggIiBjbGFzcz0iR3JlZW4iIC8+DQo8L3N2
Zz4L
</value>
</data>
</root>

View File

@@ -0,0 +1,211 @@
Imports System.Collections.Concurrent
Imports System.Threading
Imports System.Threading.Tasks
Imports DigitalData.Modules.EDMI.API
Imports DigitalData.Modules.EDMI.API.Constants
Imports DigitalData.Modules.EDMI.API.DatabaseWithFallback
Imports DigitalData.Modules.Logging
Public Class frmAdmin_AppserviceTest
' ── Lasttest-Felder ────────────────────────────────────────────────────
Private _loadClients As List(Of Client) ' Typisiert auf Client statt Object
Private _loadTimer As System.Windows.Forms.Timer
Private _loadLog As New ConcurrentQueue(Of String)
Private _loadCts As CancellationTokenSource
Private _timerTick As Integer = 0
Private LOAD_CLIENT_COUNT As Integer = 100
Private Shared ReadOnly _rnd As New Random() ' ◄ ergänzen
Private Sub SimpleButton1_Click(sender As Object, e As EventArgs) Handles SimpleButton1.Click
' Status abrufen
Dim oStatus = _EDMIClient.GetStatus()
LOGGER.Info(oStatus.ToString())
' Einzelne Felder
ListBoxControl1.Items.Clear()
ListBoxControl1.Items.Add($"Online-Status: {oStatus.IsOnline}")
ListBoxControl1.Items.Add($"Channel-State: {oStatus.ChannelState}")
ListBoxControl1.Items.Add($"Anzahl Verbindungen: {oStatus.ActiveConnections}")
ListBoxControl1.Items.Add($"Cached Tables ({oStatus.CachedTableCount})")
If oStatus.IsOnline And oStatus.ChannelState = "Opened" And oStatus.ActiveConnections > 0 And oStatus.CachedTableCount > 1 Then
lblServiceOnline.Visible = True
lblAppServiceOffline.Visible = False
Else
lblServiceOnline.Visible = False
lblAppServiceOffline.Visible = True
End If
Dim oClients = _EDMIClient.GetAllClientStatus()
ListBoxControl1.Items.Add("=============== Geöffnete Clients ===============")
For Each oStatus In oClients
ListBoxControl1.Items.Add(oStatus.ToString())
LOGGER.Info(oStatus.ToString())
Next
End Sub
Private Sub SimpleButton2_Click(sender As Object, e As EventArgs) Handles btnLoadStart.Click
If _loadTimer IsNot Nothing AndAlso _loadTimer.Enabled Then
MessageBox.Show("Lasttest läuft bereits.", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return
End If
LOAD_CLIENT_COUNT = NumericUpDown1.Value
_loadLog = New ConcurrentQueue(Of String)
_loadCts = New CancellationTokenSource()
_timerTick = 0
' 150 Client-Verbindungen parallel aufbauen
btnLoadStart.Enabled = False
btnLoadStop.Enabled = True
btnLoadStop.Visible = True
ListBoxControl2.Items.Clear()
ListBoxControl2.Items.Add($"[{Now:HH:mm:ss}] Baue {LOAD_CLIENT_COUNT} Verbindungen auf…")
Task.Run(Sub()
_loadClients = New List(Of Client)
Dim errors As Integer = 0
Parallel.For(0, LOAD_CLIENT_COUNT,
New ParallelOptions With {.CancellationToken = _loadCts.Token},
Sub(i)
Try
' ► Hier ggf. eigene Client-Factory verwenden
Dim oClientName = "PerformanceClient_" & (i + 1)
Dim oClient = New Client(LOGCONFIG, CONFIG.Config.EDMIAppServer, oClientName)
Dim oConnected = oClient.Connect() ' ◄ Connect() muss aufgerufen werden
SyncLock _loadClients
If oConnected Then ' ◄ nur verbundene hinzufügen
_loadClients.Add(oClient)
_loadLog.Enqueue($"[{Now:HH:mm:ss}] Client #{i + 1} verbunden")
Else
oClient.Dispose()
Interlocked.Increment(errors)
_loadLog.Enqueue($"[{Now:HH:mm:ss}] Client #{i + 1} Connect() fehlgeschlagen")
End If
End SyncLock
_loadLog.Enqueue($"[{Now:HH:mm:ss}] Client #{i + 1} verbunden")
Catch ex As Exception
Interlocked.Increment(errors)
_loadLog.Enqueue($"[{Now:HH:mm:ss}] Client #{i + 1} Fehler: {ex.Message}")
End Try
End Sub)
Me.Invoke(Sub()
FlushLoadLog()
ListBoxControl2.Items.Add($"[{Now:HH:mm:ss}] {_loadClients.Count} Clients aktiv, {errors} Fehler")
StartLoadTimer()
End Sub)
End Sub)
End Sub
Private Sub StopLoadTest()
_loadCts?.Cancel()
If _loadTimer IsNot Nothing Then
_loadTimer.Stop()
_loadTimer.Dispose()
_loadTimer = Nothing
End If
' Alle Client-Verbindungen sauber schließen
If _loadClients IsNot Nothing Then
For Each oClient In _loadClients
Try
oClient.Dispose()
Catch
End Try
Next
_loadClients.Clear()
End If
ListBoxControl2.Items.Add($"[{Now:HH:mm:ss}] Lasttest beendet.")
btnLoadStart.Enabled = True
btnLoadStop.Enabled = False
End Sub
' ── Timer für zyklische Lastoperationen ───────────────────────────────
Private Sub StartLoadTimer()
_loadTimer = New System.Windows.Forms.Timer With {.Interval = 1000} ' jede Sekunde
AddHandler _loadTimer.Tick, AddressOf LoadTimer_Tick
_loadTimer.Start()
End Sub
Private Sub LoadTimer_Tick(sender As Object, e As EventArgs)
_timerTick += 1
FlushLoadLog()
Task.Run(Sub()
If _loadClients Is Nothing OrElse _loadClients.Count = 0 Then Return
Parallel.ForEach(_loadClients,
New ParallelOptions With {.CancellationToken = _loadCts.Token},
Sub(oClient As Client) ' ◄ Typisiert, wird jetzt tatsächlich genutzt
Try
Select Case _timerTick Mod 4
Case 0
' ► GetStatus je Client
Dim st = oClient.GetStatus()
_loadLog.Enqueue($"[{Now:HH:mm:ss}] Status: Online={st.IsOnline}, Conn={st.ActiveConnections}")
Case 1
' ► Zufällige DB-Abfrage über den jeweiligen Client
Dim iChoice As Integer
SyncLock _rnd
iChoice = _rnd.Next(0, 3) ' 0, 1 oder 2
End SyncLock
Select Case iChoice
Case 0
oClient.GetDatatableFromECM("SELECT * FROM TBDD_CONNECTION WITH (NOLOCK) WHERE AKTIV = 1")
_loadLog.Enqueue($"[{Now:HH:mm:ss}] GetDatatableFromECM → TBDD_CONNECTION")
Case 1
oClient.GetDatatableFromECM("SELECT * FROM TBDD_USER")
_loadLog.Enqueue($"[{Now:HH:mm:ss}] GetDatatableFromECM → TBDD_USER")
Case 2
oClient.GetDatatableFromECM("SELECT * FROM TBDD_GUI_LANGUAGE_PHRASE WITH (NOLOCK) WHERE MODULE IN ('PM','All Modules')")
_loadLog.Enqueue($"[{Now:HH:mm:ss}] GetDatatableFromECM → TBDD_GUI_LANGUAGE_PHRASE")
End Select
Case 2
' ► Cache-Zugriff
Dim st = oClient.GetStatus()
_loadLog.Enqueue($"[{Now:HH:mm:ss}] Cached Tables: {st.CachedTableCount}")
Case 3
' ► Channel-State prüfen
Dim st = oClient.GetStatus()
_loadLog.Enqueue($"[{Now:HH:mm:ss}] Channel: {st.ChannelState}")
End Select
Catch ex As OperationCanceledException
' Lasttest gestoppt
Catch ex As Exception
_loadLog.Enqueue($"[{Now:HH:mm:ss}] Fehler: {ex.Message}")
End Try
End Sub)
Me.Invoke(Sub() FlushLoadLog())
End Sub)
End Sub
' ── Log-Einträge in ListBox schreiben ─────────────────────────────────
Private Sub FlushLoadLog()
Dim msg As String = Nothing
Dim added As Boolean = False
While _loadLog.TryDequeue(msg)
ListBoxControl2.Items.Add(msg)
added = True
End While
If added Then
ListBoxControl2.SelectedIndex = ListBoxControl2.Items.Count - 1
End If
End Sub
' ── Aufräumen beim Schließen ──────────────────────────────────────────
Private Sub frmAdmin_AppserviceTest_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
StopLoadTest()
End Sub
Private Sub btnLoadStop_Click(sender As Object, e As EventArgs) Handles btnLoadStop.Click
StopLoadTest()
End Sub
Private Sub frmAdmin_AppserviceTest_Load(sender As Object, e As EventArgs) Handles Me.Load
End Sub
End Class

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -282,8 +282,13 @@ Public Class frmMain
bsiLicenses.Caption = oCaption
bsiLicenses.Visibility = DevExpress.XtraBars.BarItemVisibility.Always
If EDMIAppServerActive = True Then
bbtnitm_Appservice.Visibility = DevExpress.XtraBars.BarItemVisibility.Always
End If
Else
bsiLicenses.Visibility = DevExpress.XtraBars.BarItemVisibility.Never
bbtnitm_Appservice.Visibility = DevExpress.XtraBars.BarItemVisibility.Never
End If
LOGGER.Debug("Initializing MainForm....")
@@ -1784,8 +1789,8 @@ Public Class frmMain
If LOG_HOTSPOTS Then
Dim elapsed = (DateTime.Now - perfStep).TotalMilliseconds
Dim rowCount = If(DT_CURR_WF_ITEMS IsNot Nothing, DT_CURR_WF_ITEMS.Rows.Count, 0)
If elapsed > 4000 Then
LOGGER.Warn($"[PERF LoadOverviewData] ⚠️ Datenbank-Abfrage für Workflows LANGSAM: {elapsed}ms ({rowCount} Zeilen) (Schwellwert: 4000ms) - SQL prüfen!")
If elapsed > 5000 Then
LOGGER.Warn($"[PERF LoadOverviewData] ⚠️ Datenbank-Abfrage für Workflows LANGSAM: {elapsed}ms ({rowCount} Zeilen) (Schwellwert: 5000ms) - SQL prüfen!")
Else
LOGGER.Info($"[PERF LoadOverviewData] Datenbank-Abfrage für Workflows: {elapsed}ms ({rowCount} Zeilen)")
End If
@@ -1878,8 +1883,8 @@ Public Class frmMain
If LOG_HOTSPOTS Then
Dim totalElapsed = (DateTime.Now - perfStart).TotalMilliseconds
If totalElapsed > 4000 Then
LOGGER.Warn($"[PERF LoadOverviewData] ⚠️ GESAMT LANGSAM: {totalElapsed}ms (Schwellwert: 4000ms)")
If totalElapsed > 5000 Then
LOGGER.Warn($"[PERF LoadOverviewData] ⚠️ GESAMT LANGSAM: {totalElapsed}ms (Schwellwert: 5000ms)")
Else
LOGGER.Info($"[PERF LoadOverviewData] GESAMT: {totalElapsed}ms")
End If
@@ -3221,8 +3226,8 @@ Public Class frmMain
If LOG_HOTSPOTS Then
Dim totalElapsed = (DateTime.Now - perfStart).TotalMilliseconds
If totalElapsed > 4000 Then
LOGGER.Warn($"[PERF Load_Grid_Overview] ⚠️ GESAMT LANGSAM: {totalElapsed}ms (Schwellwert: 4000ms)")
If totalElapsed > 5500 Then
LOGGER.Warn($"[PERF Load_Grid_Overview] ⚠️ GESAMT LANGSAM: {totalElapsed}ms (Schwellwert: 5500)")
Else
LOGGER.Info($"[PERF Load_Grid_Overview] GESAMT: {totalElapsed}ms")
End If
@@ -5176,4 +5181,8 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G
Private Sub BarButtonItem3_ItemClick_3(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem3.ItemClick
frmCockpitConfig.Show()
End Sub
Private Sub bbtnitm_Appservice_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtnitm_Appservice.ItemClick
frmAdmin_AppserviceTest.Show()
End Sub
End Class

View File

@@ -958,6 +958,7 @@ Public Class frmValidator
Public Function Test_Additional_Data_Searches_Exist() As Boolean
If DT_FILTERED_PROFILE_SEARCHES_DATA.Rows.Count > 0 Then
MyValidationLogger.Debug("Test_Additional_Data_Searches_Exist: Prüfe zusätzliche Datensuchen...")
Dim oDataResultCommand As String
Dim oDatatableDataResult As DataTable = Nothing
@@ -965,13 +966,14 @@ Public Class frmValidator
'Check whether DocData is there
oDataResultCommand = DT_FILTERED_PROFILE_SEARCHES_DATA.Rows(0).Item("SQL_COMMAND")
oDataResultCommand = clsPatterns.ReplaceAllValues(oDataResultCommand, PanelValidatorControl, True)
oDatatableDataResult = DatabaseFallback.GetDatatable(New GetDatatableOptions(oDataResultCommand, DatabaseType.ECM))
oDatatableDataResult = DatabaseFallback.GetDatatableECM(oDataResultCommand)
End If
Dim oDataResultsExist As Boolean = False
If DT_FILTERED_PROFILE_SEARCHES_DATA.Rows.Count > 0 Then
If Not IsNothing(oDatatableDataResult) Then
MyValidationLogger.Debug($"Test_Additional_Data_Searches_Exist: Ergebnis-Datatable erhalten mit {oDatatableDataResult.Rows.Count} Zeilen.")
If oDatatableDataResult.Rows.Count > 0 Then
oDataResultsExist = True
End If
@@ -986,25 +988,29 @@ Public Class frmValidator
End Function
Public Function Test_Additional_Doc_Searches_Exist() As Boolean
If DT_FILTERED_PROFILE_SEARCHES_DOC.Rows.Count > 0 Then
MyValidationLogger.Debug("Test_Additional_Doc_Searches_Exist: Prüfe zusätzliche Dokumentensuchen...")
Dim oDocResultCommand As String
Dim oDatatableDocResult As DataTable = Nothing
'Check whether DocData is there
Dim oConID = DT_FILTERED_PROFILE_SEARCHES_DOC.Rows(0).Item("CONN_ID")
oDocResultCommand = DT_FILTERED_PROFILE_SEARCHES_DOC.Rows(0).Item("SQL_COMMAND")
oDocResultCommand = clsPatterns.ReplaceAllValues(oDocResultCommand, PanelValidatorControl, True)
oDatatableDocResult = DatabaseFallback.GetDatatableWithConnection(oDocResultCommand, oConID)
oDatatableDocResult = DatabaseFallback.GetDatatableECM(oDocResultCommand)
Dim oDocResultsExist As Boolean = False
If Not IsNothing(oDatatableDocResult) Then
MyValidationLogger.Debug($"Test_Additional_Doc_Searches_Exist: Ergebnis-Datatable erhalten mit {oDatatableDocResult.Rows.Count} Zeilen.")
If oDatatableDocResult.Rows.Count > 0 Then
oDocResultsExist = True
DT_AdditionalSearches_Resultset_Docs = oDatatableDocResult
End If
Else
MyValidationLogger.Warn("⚠Test_Additional_Doc_Searches_Exist: Ergebnis-Datatable ist Nothing.")
End If
Return oDocResultsExist
Else
MyValidationLogger.Debug("Test_Additional_Doc_Searches_Exist: Keine zusätzlichen Dokumentensuchen konfiguriert.")
Return False
End If
End Function
@@ -1117,6 +1123,12 @@ Public Class frmValidator
rbnPgGroupAttmt.Visible = AdditionalDataResultsExist OrElse AdditionalDocResultsExist
MyValidationLogger.Debug($"rbnPgGroupAttmt.Visible gesetzt auf: {rbnPgGroupAttmt.Visible} | Stack: {New System.Diagnostics.StackTrace(True).ToString().Split(vbCrLf)(1)}")
If AdditionalDocResultsExist Then
Test_Additional_Doc_Searches_Exist()
Else
DT_AdditionalSearches_Resultset_Docs = Nothing
End If
If Not AdditionalDataResultsExist AndAlso Not AdditionalDocResultsExist Then
If _frmValidatorSearch IsNot Nothing AndAlso Not _frmValidatorSearch.IsDisposed Then
Dim emptySql As DataTable = allSQLSearches.Clone()

View File

@@ -294,6 +294,9 @@
<HintPath>..\packages\GdPicture.14.4.4\lib\net462\GdPicture.NET.14.wia.gateway.dll</HintPath>
<EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>
<Reference Include="GdPicture.NET.14.WinForms, Version=14.4.4.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
<HintPath>..\packages\GdPicture.WinForms.14.4.4\lib\net462\GdPicture.NET.14.WinForms.dll</HintPath>
</Reference>
<Reference Include="Google.Protobuf, Version=3.33.2.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Protobuf.3.33.2\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
@@ -548,6 +551,12 @@
<Compile Include="frmAdminPasswort.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="frmAdmin_AppserviceTest.Designer.vb">
<DependentUpon>frmAdmin_AppserviceTest.vb</DependentUpon>
</Compile>
<Compile Include="frmAdmin_AppserviceTest.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="frmAdmin_notResponsibleConfig.Designer.vb">
<DependentUpon>frmAdmin_notResponsibleConfig.vb</DependentUpon>
</Compile>
@@ -834,6 +843,9 @@
<DependentUpon>frmAdminPasswort.vb</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="frmAdmin_AppserviceTest.resx">
<DependentUpon>frmAdmin_AppserviceTest.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="frmAdmin_notResponsibleConfig.resx">
<DependentUpon>frmAdmin_notResponsibleConfig.vb</DependentUpon>
<SubType>Designer</SubType>