添加项目文件。
This commit is contained in:
1 parent
8cba828b45
commit
fea866f74f
24 files changed
+1503
No files matched your search
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<configuration>
|
||||||
|
<startup>
|
||||||
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
|
||||||
|
</startup>
|
||||||
|
</configuration>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<Application x:Class="DyeingComputer.App"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:local="clr-namespace:DyeingComputer"
|
||||||
|
StartupUri="MainWindow.xaml">
|
||||||
|
<Application.Resources>
|
||||||
|
|
||||||
|
</Application.Resources>
|
||||||
|
</Application>
|
||||||
+114
@@ -0,0 +1,114 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Configuration;
|
||||||
|
using System.Data;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
namespace DyeingComputer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// App.xaml 的交互逻辑
|
||||||
|
/// </summary>
|
||||||
|
public partial class App : Application
|
||||||
|
{
|
||||||
|
|
||||||
|
public App()
|
||||||
|
{
|
||||||
|
this.Startup += new StartupEventHandler(App_Startup);
|
||||||
|
this.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);
|
||||||
|
}
|
||||||
|
System.Threading.Mutex mutex;
|
||||||
|
void App_Startup(object sender, StartupEventArgs e) //程序只允许启动一次
|
||||||
|
{
|
||||||
|
bool ret;
|
||||||
|
mutex = new System.Threading.Mutex(true, "ElectronicNeedleTherapySystem", out ret);
|
||||||
|
if (!ret)
|
||||||
|
{
|
||||||
|
MessageBox.Show("The program has been launched");
|
||||||
|
Environment.Exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnStartup(StartupEventArgs e) //跟踪报错信息
|
||||||
|
{
|
||||||
|
base.OnStartup(e);
|
||||||
|
//UI线程的异常捕捉
|
||||||
|
this.DispatcherUnhandledException += App_DispatcherUnhandledException;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
|
||||||
|
{
|
||||||
|
e.Handled = true;
|
||||||
|
if (e.Exception.InnerException == null)
|
||||||
|
{
|
||||||
|
MessageBox.Show("发生了一个无法处理的错误!请联系SUNLIGHT处理!"
|
||||||
|
+ "(1)错误" + Environment.NewLine
|
||||||
|
+ "(2)错误源:" + e.Exception.Source + Environment.NewLine
|
||||||
|
// + (3)详细信息:" + e.Exception.Message + Environment.NewLine
|
||||||
|
// + "(4)报错区域:" + e.Exception.StackTrace
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MessageBox.Show("发生了一个无法处理的错误!请联系SUNLIGHT处理!"
|
||||||
|
+ "(1)错误" + Environment.NewLine
|
||||||
|
// + "(2)错误源:" + e.Exception.InnerException.Source + Environment.NewLine
|
||||||
|
+ "(3)错误信息:" + e.Exception.Message + Environment.NewLine
|
||||||
|
// + "(4)详细信息:" + e.Exception.InnerException.Message + Environment.NewLine
|
||||||
|
// + "(5)报错区域:" + e.Exception.InnerException.StackTrace
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
string Log_time = DateTime.Now.ToString("yyyy-MM-dd");
|
||||||
|
string logpath = System.Environment.CurrentDirectory + "\\ERR";//日志文件目录
|
||||||
|
//string logPathtxt = "" + System.Environment.CurrentDirectory + "\\Log\\"+ Log_time + "Log.txt";//日志文件
|
||||||
|
// System.IO.DirectoryInfo log = new System.IO.DirectoryInfo();//生成日志文件目录
|
||||||
|
string log_path = logpath + "\\ERR" + Log_time + ".txt";
|
||||||
|
string Log_timehms = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
||||||
|
if (Directory.Exists(logpath))//检查日志路径
|
||||||
|
{
|
||||||
|
if (!File.Exists(log_path))//检查文件并写入
|
||||||
|
{
|
||||||
|
FileStream fs = new FileStream(log_path, FileMode.CreateNew, FileAccess.Write);//创建文件
|
||||||
|
StreamWriter wr = new StreamWriter(fs);//创建文件
|
||||||
|
wr.Close();
|
||||||
|
FileStream fil = new FileStream(log_path, FileMode.Append, FileAccess.Write);//创建写入文件
|
||||||
|
StreamWriter wfil = new StreamWriter(fil);//创建文件
|
||||||
|
wfil.WriteLine("[" + Log_timehms + "];[Error] ||" + Environment.NewLine.ToString());
|
||||||
|
wfil.WriteLine("[" + Log_timehms + "];[Error source] ||" + e.Exception.Source.ToString() + Environment.NewLine.ToString());
|
||||||
|
wfil.WriteLine("[" + Log_timehms + "];[Error message] ||" + e.Exception.Message.ToString() + Environment.NewLine.ToString());
|
||||||
|
wfil.WriteLine("[" + Log_timehms + "];[Error area] ||" + e.Exception.StackTrace.ToString());
|
||||||
|
wfil.Close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FileStream fs = new FileStream(log_path, FileMode.Append, FileAccess.Write);//创建写入文件
|
||||||
|
StreamWriter wr = new StreamWriter(fs);//创建文件
|
||||||
|
wr.WriteLine("[" + Log_timehms + "];[Error] ||" + Environment.NewLine.ToString());
|
||||||
|
wr.WriteLine("[" + Log_timehms + "];[Error source] ||" + e.Exception.Source.ToString() + Environment.NewLine.ToString());
|
||||||
|
wr.WriteLine("[" + Log_timehms + "];[Error message] ||" + e.Exception.Message.ToString() + Environment.NewLine.ToString());
|
||||||
|
wr.WriteLine("[" + Log_timehms + "];[Error area] ||" + e.Exception.StackTrace.ToString());
|
||||||
|
wr.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DirectoryInfo directoryInfo = new DirectoryInfo(logpath);
|
||||||
|
directoryInfo.Create();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 启动初始页面
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
private void Application_Startup(object sender, StartupEventArgs e)
|
||||||
|
{
|
||||||
|
Application.Current.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);//和MainWindwo同一目录
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{18FD96BD-D3DD-46DA-BE92-CA942F27D4DD}</ProjectGuid>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<RootNamespace>DyeingComputer</RootNamespace>
|
||||||
|
<AssemblyName>DyeingComputer</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
|
<Deterministic>true</Deterministic>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Management" />
|
||||||
|
<Reference Include="System.Windows.Forms" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
<Reference Include="System.Xaml">
|
||||||
|
<RequiredTargetFramework>4.0</RequiredTargetFramework>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="WindowsBase" />
|
||||||
|
<Reference Include="PresentationCore" />
|
||||||
|
<Reference Include="PresentationFramework" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ApplicationDefinition Include="App.xaml">
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</ApplicationDefinition>
|
||||||
|
<Compile Include="UserClass\CRCcheck16.cs" />
|
||||||
|
<Compile Include="UserClass\DataGridHelper.cs" />
|
||||||
|
<Compile Include="UserClass\DataTableForToObservableCollection.cs" />
|
||||||
|
<Compile Include="UserClass\get_local_ip_address.cs" />
|
||||||
|
<Compile Include="UserClass\HardwareSN.cs" />
|
||||||
|
<Compile Include="UserClass\IniFile.cs" />
|
||||||
|
<Compile Include="UserClass\LogDataRead.cs" />
|
||||||
|
<Compile Include="UserClass\LogGing.cs" />
|
||||||
|
<Compile Include="UserClass\MD5check.cs" />
|
||||||
|
<Compile Include="UserClass\PressKey.cs" />
|
||||||
|
<Compile Include="UserClass\StrToInt.cs" />
|
||||||
|
<Compile Include="UserClass\TCPServer.cs" />
|
||||||
|
<Page Include="MainWindow.xaml">
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</Page>
|
||||||
|
<Compile Include="App.xaml.cs">
|
||||||
|
<DependentUpon>App.xaml</DependentUpon>
|
||||||
|
<SubType>Code</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="MainWindow.xaml.cs">
|
||||||
|
<DependentUpon>MainWindow.xaml</DependentUpon>
|
||||||
|
<SubType>Code</SubType>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs">
|
||||||
|
<SubType>Code</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Properties\Resources.Designer.cs">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Properties\Settings.Designer.cs">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Settings.settings</DependentUpon>
|
||||||
|
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||||
|
</Compile>
|
||||||
|
<EmbeddedResource Include="Properties\Resources.resx">
|
||||||
|
<Generator>ResXFileCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<None Include="Properties\Settings.settings">
|
||||||
|
<Generator>SettingsSingleFileGenerator</Generator>
|
||||||
|
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="App.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.10.35122.118
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DyeingComputer", "DyeingComputer.csproj", "{18FD96BD-D3DD-46DA-BE92-CA942F27D4DD}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{18FD96BD-D3DD-46DA-BE92-CA942F27D4DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{18FD96BD-D3DD-46DA-BE92-CA942F27D4DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{18FD96BD-D3DD-46DA-BE92-CA942F27D4DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{18FD96BD-D3DD-46DA-BE92-CA942F27D4DD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {23C27729-172E-4ACB-8978-76C890F41C29}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<Window x:Class="DyeingComputer.MainWindow"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:local="clr-namespace:DyeingComputer"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
Title="SUNLIGHT 838 b0.0.1 (2024/08/10)" Height="450" Width="800">
|
||||||
|
<Grid>
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
</Window>
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
|
||||||
|
namespace DyeingComputer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// MainWindow.xaml 的交互逻辑
|
||||||
|
/// </summary>
|
||||||
|
public partial class MainWindow : Window
|
||||||
|
{
|
||||||
|
public MainWindow()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Resources;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
// 有关程序集的一般信息由以下
|
||||||
|
// 控制。更改这些特性值可修改
|
||||||
|
// 与程序集关联的信息。
|
||||||
|
[assembly: AssemblyTitle("DyeingComputer")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("DyeingComputer")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2024")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// 将 ComVisible 设置为 false 会使此程序集中的类型
|
||||||
|
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
|
||||||
|
//请将此类型的 ComVisible 特性设置为 true。
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
//若要开始生成可本地化的应用程序,请设置
|
||||||
|
//.csproj 文件中的 <UICulture>CultureYouAreCodingWith</UICulture>
|
||||||
|
//在 <PropertyGroup> 中。例如,如果你使用的是美国英语。
|
||||||
|
//使用的是美国英语,请将 <UICulture> 设置为 en-US。 然后取消
|
||||||
|
//对以下 NeutralResourceLanguage 特性的注释。 更新
|
||||||
|
//以下行中的“en-US”以匹配项目文件中的 UICulture 设置。
|
||||||
|
|
||||||
|
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
|
||||||
|
|
||||||
|
|
||||||
|
[assembly: ThemeInfo(
|
||||||
|
ResourceDictionaryLocation.None, //主题特定资源词典所处位置
|
||||||
|
//(未在页面中找到资源时使用,
|
||||||
|
//或应用程序资源字典中找到时使用)
|
||||||
|
ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
|
||||||
|
//(未在页面中找到资源时使用,
|
||||||
|
//、应用程序或任何主题专用资源字典中找到时使用)
|
||||||
|
)]
|
||||||
|
|
||||||
|
|
||||||
|
// 程序集的版本信息由下列四个值组成:
|
||||||
|
//
|
||||||
|
// 主版本
|
||||||
|
// 次版本
|
||||||
|
// 生成号
|
||||||
|
// 修订号
|
||||||
|
//
|
||||||
|
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
|
||||||
|
//通过使用 "*",如下所示:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
Generated
+71
@@ -0,0 +1,71 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// 此代码由工具生成。
|
||||||
|
// 运行时版本: 4.0.30319.42000
|
||||||
|
//
|
||||||
|
// 对此文件的更改可能导致不正确的行为,如果
|
||||||
|
// 重新生成代码,则所做更改将丢失。
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace DyeingComputer.Properties
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 强类型资源类,用于查找本地化字符串等。
|
||||||
|
/// </summary>
|
||||||
|
// 此类是由 StronglyTypedResourceBuilder
|
||||||
|
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
|
||||||
|
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
|
||||||
|
// (以 /str 作为命令选项),或重新生成 VS 项目。
|
||||||
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
|
internal class Resources
|
||||||
|
{
|
||||||
|
|
||||||
|
private static global::System.Resources.ResourceManager resourceMan;
|
||||||
|
|
||||||
|
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||||
|
|
||||||
|
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||||
|
internal Resources()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 返回此类使用的缓存 ResourceManager 实例。
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static global::System.Resources.ResourceManager ResourceManager
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if ((resourceMan == null))
|
||||||
|
{
|
||||||
|
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DyeingComputer.Properties.Resources", typeof(Resources).Assembly);
|
||||||
|
resourceMan = temp;
|
||||||
|
}
|
||||||
|
return resourceMan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重写当前线程的 CurrentUICulture 属性,对
|
||||||
|
/// 使用此强类型资源类的所有资源查找执行重写。
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static global::System.Globalization.CultureInfo Culture
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return resourceCulture;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
resourceCulture = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
<?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.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: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" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
</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" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
||||||
Generated
+30
@@ -0,0 +1,30 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
// Runtime Version:4.0.30319.42000
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace DyeingComputer.Properties
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
||||||
|
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
|
||||||
|
{
|
||||||
|
|
||||||
|
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||||
|
|
||||||
|
public static Settings Default
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return defaultInstance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
|
||||||
|
<Profiles>
|
||||||
|
<Profile Name="(Default)" />
|
||||||
|
</Profiles>
|
||||||
|
<Settings />
|
||||||
|
</SettingsFile>
|
||||||
@@ -0,0 +1,190 @@
|
|||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace formula_manage.UserClass
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// CRC校验
|
||||||
|
/// </summary>
|
||||||
|
public class CRCcheck16
|
||||||
|
{
|
||||||
|
|
||||||
|
#region CRC16
|
||||||
|
public static byte[] CRC16(byte[] data)
|
||||||
|
{
|
||||||
|
int len = data.Length;
|
||||||
|
if (len > 0)
|
||||||
|
{
|
||||||
|
ushort crc = 0xFFFF;
|
||||||
|
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
crc = (ushort)(crc ^ (data[i]));
|
||||||
|
for (int j = 0; j < 8; j++)
|
||||||
|
{
|
||||||
|
crc = (crc & 1) != 0 ? (ushort)((crc >> 1) ^ 0xA001) : (ushort)(crc >> 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
byte hi = (byte)((crc & 0xFF00) >> 8); //高位置
|
||||||
|
byte lo = (byte)(crc & 0x00FF); //低位置
|
||||||
|
|
||||||
|
return new byte[] { hi, lo };
|
||||||
|
}
|
||||||
|
return new byte[] { 0, 0 };
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ToCRC16
|
||||||
|
public static string ToCRC16(string content)
|
||||||
|
{
|
||||||
|
return ToCRC16(content, Encoding.UTF8);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ToCRC16(string content, bool isReverse)
|
||||||
|
{
|
||||||
|
return ToCRC16(content, Encoding.UTF8, isReverse);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ToCRC16(string content, Encoding encoding)
|
||||||
|
{
|
||||||
|
return ByteToString(CRC16(encoding.GetBytes(content)), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ToCRC16(string content, Encoding encoding, bool isReverse)
|
||||||
|
{
|
||||||
|
return ByteToString(CRC16(encoding.GetBytes(content)), isReverse);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ToCRC16(byte[] data)
|
||||||
|
{
|
||||||
|
return ByteToString(CRC16(data), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ToCRC16(byte[] data, bool isReverse)
|
||||||
|
{
|
||||||
|
return ByteToString(CRC16(data), isReverse);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ToModbusCRC16
|
||||||
|
public static string ToModbusCRC16(string s)
|
||||||
|
{
|
||||||
|
return ToModbusCRC16(s, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ToModbusCRC16(string s, bool isReverse)
|
||||||
|
{
|
||||||
|
return ByteToString(CRC16(StringToHexByte(s)), isReverse);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ToModbusCRC16(byte[] data)
|
||||||
|
{
|
||||||
|
return ToModbusCRC16(data, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ToModbusCRC16(byte[] data, bool isReverse)
|
||||||
|
{
|
||||||
|
return ByteToString(CRC16(data), isReverse);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ByteToString
|
||||||
|
public static string ByteToString(byte[] arr, bool isReverse)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
byte hi = arr[0], lo = arr[1];
|
||||||
|
return Convert.ToString(isReverse ? hi + lo * 0x100 : hi * 0x100 + lo, 16).ToUpper().PadLeft(4, '0');
|
||||||
|
}
|
||||||
|
catch (Exception ex) { throw (ex); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ByteToString(byte[] arr)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return ByteToString(arr, true);
|
||||||
|
}
|
||||||
|
catch (Exception ex) { throw (ex); }
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region StringToHexString
|
||||||
|
public static string StringToHexString(string str)
|
||||||
|
{
|
||||||
|
StringBuilder s = new StringBuilder();
|
||||||
|
foreach (short c in str.ToCharArray())
|
||||||
|
{
|
||||||
|
s.Append(c.ToString("X4"));
|
||||||
|
}
|
||||||
|
return s.ToString();
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region StringToHexByte
|
||||||
|
private static string ConvertChinese(string str)
|
||||||
|
{
|
||||||
|
StringBuilder s = new StringBuilder();
|
||||||
|
foreach (short c in str.ToCharArray())
|
||||||
|
{
|
||||||
|
if (c <= 0 || c >= 127)
|
||||||
|
{
|
||||||
|
s.Append(c.ToString("X4"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s.Append((char)c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return s.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string FilterChinese(string str)
|
||||||
|
{
|
||||||
|
StringBuilder s = new StringBuilder();
|
||||||
|
foreach (short c in str.ToCharArray())
|
||||||
|
{
|
||||||
|
if (c > 0 && c < 127)
|
||||||
|
{
|
||||||
|
s.Append((char)c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return s.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 字符串转16进制字符数组
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hex"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static byte[] StringToHexByte(string str)
|
||||||
|
{
|
||||||
|
return StringToHexByte(str, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 字符串转16进制字符数组
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str"></param>
|
||||||
|
/// <param name="isFilterChinese">是否过滤掉中文字符</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static byte[] StringToHexByte(string str, bool isFilterChinese)
|
||||||
|
{
|
||||||
|
string hex = isFilterChinese ? FilterChinese(str) : ConvertChinese(str);
|
||||||
|
|
||||||
|
//清除所有空格
|
||||||
|
hex = hex.Replace(" ", "");
|
||||||
|
//若字符个数为奇数,补一个0
|
||||||
|
hex += hex.Length % 2 != 0 ? "0" : "";
|
||||||
|
|
||||||
|
byte[] result = new byte[hex.Length / 2];
|
||||||
|
for (int i = 0, c = result.Length; i < c; i++)
|
||||||
|
{
|
||||||
|
result[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
using System;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
|
||||||
|
namespace formula_manage.UserClass
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 实时更新datagrid
|
||||||
|
/// 调用示例:DataGridHelper.SetRealTimeCommit(Grid, true); Grid为对象控件名
|
||||||
|
/// </summary>
|
||||||
|
public static class DataGridHelper
|
||||||
|
{
|
||||||
|
public static void SetRealTimeCommit(DataGrid dataGrid, bool isRealTime)
|
||||||
|
{
|
||||||
|
dataGrid.SetValue(RealTimeCommitProperty, isRealTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool GetRealTimeCommit(DataGrid dataGrid)
|
||||||
|
{
|
||||||
|
return (bool)dataGrid.GetValue(RealTimeCommitProperty);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static readonly DependencyProperty RealTimeCommitProperty =
|
||||||
|
DependencyProperty.RegisterAttached("RealTimeCommit", typeof(bool),
|
||||||
|
typeof(DataGridHelper),
|
||||||
|
new PropertyMetadata(false, RealTimeCommitCallBack));
|
||||||
|
|
||||||
|
private static void RealTimeCommitCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
var dg = d as DataGrid;
|
||||||
|
if (dg == null)
|
||||||
|
return;
|
||||||
|
EventHandler<DataGridCellEditEndingEventArgs> ceHandler = delegate (object xx, DataGridCellEditEndingEventArgs yy)
|
||||||
|
{
|
||||||
|
var flag = GetRealTimeCommit(dg);
|
||||||
|
if (!flag)
|
||||||
|
return;
|
||||||
|
var cellContent = yy.Column.GetCellContent(yy.Row);
|
||||||
|
if (cellContent != null && cellContent.BindingGroup != null)
|
||||||
|
cellContent.BindingGroup.CommitEdit();
|
||||||
|
};
|
||||||
|
dg.CellEditEnding += ceHandler;
|
||||||
|
RoutedEventHandler eh = null;
|
||||||
|
eh = (xx, yy) =>
|
||||||
|
{
|
||||||
|
dg.Unloaded -= eh;
|
||||||
|
dg.CellEditEnding -= ceHandler;
|
||||||
|
};
|
||||||
|
dg.Unloaded += eh;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Data;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace formula_manage.UserClass
|
||||||
|
{
|
||||||
|
internal class DataTableToObservableCollection //数据表到可观察集合
|
||||||
|
{
|
||||||
|
public ObservableCollection<T> ToObservableCollection<T>(DataTable dt) where T : class, new()
|
||||||
|
{
|
||||||
|
Type t = typeof(T);
|
||||||
|
PropertyInfo[] propertys = t.GetProperties();
|
||||||
|
ObservableCollection<T> lst = new ObservableCollection<T>();
|
||||||
|
string typeName = string.Empty;
|
||||||
|
foreach (DataRow dr in dt.Rows)
|
||||||
|
{
|
||||||
|
T entity = new T();
|
||||||
|
foreach (PropertyInfo pi in propertys)
|
||||||
|
{
|
||||||
|
typeName = pi.Name;
|
||||||
|
if (dt.Columns.Contains(typeName))
|
||||||
|
{
|
||||||
|
if (!pi.CanWrite) continue;
|
||||||
|
object value = dr[typeName];
|
||||||
|
if (value == DBNull.Value) continue;
|
||||||
|
if (pi.PropertyType == typeof(string))
|
||||||
|
{
|
||||||
|
pi.SetValue(entity, value.ToString(), null);
|
||||||
|
}
|
||||||
|
else if (pi.PropertyType == typeof(int) || pi.PropertyType == typeof(int?))
|
||||||
|
{
|
||||||
|
pi.SetValue(entity, int.Parse(value.ToString()), null);
|
||||||
|
}
|
||||||
|
else if (pi.PropertyType == typeof(DateTime?) || pi.PropertyType == typeof(DateTime))
|
||||||
|
{
|
||||||
|
pi.SetValue(entity, DateTime.Parse(value.ToString()), null);
|
||||||
|
}
|
||||||
|
else if (pi.PropertyType == typeof(float))
|
||||||
|
{
|
||||||
|
pi.SetValue(entity, float.Parse(value.ToString()), null);
|
||||||
|
}
|
||||||
|
else if (pi.PropertyType == typeof(double))
|
||||||
|
{
|
||||||
|
pi.SetValue(entity, double.Parse(value.ToString()), null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pi.SetValue(entity, value, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lst.Add(entity);
|
||||||
|
}
|
||||||
|
return lst;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
using System.Management;
|
||||||
|
|
||||||
|
namespace formula_manage.UserClass
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取硬件SN
|
||||||
|
/// </summary>
|
||||||
|
internal class HardwareSN
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取cpuid
|
||||||
|
/// </summary>
|
||||||
|
public static string GetCPUSerialNumber()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");
|
||||||
|
string cpuSerialNumber = "";
|
||||||
|
foreach (ManagementObject mo in searcher.Get())
|
||||||
|
{
|
||||||
|
cpuSerialNumber = mo["ProcessorId"].ToString().Trim();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return cpuSerialNumber;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 获取主板id
|
||||||
|
/// </summary>
|
||||||
|
public static string GetBIOSSerialNumber()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_BIOS");
|
||||||
|
string biosSerialNumber = "";
|
||||||
|
foreach (ManagementObject mo in searcher.Get())
|
||||||
|
{
|
||||||
|
biosSerialNumber = mo.GetPropertyValue("SerialNumber").ToString().Trim();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return biosSerialNumber;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 获取硬盘id
|
||||||
|
/// </summary>
|
||||||
|
public static string GetHardDiskSerialNumber()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
|
||||||
|
string hardDiskSerialNumber = "";
|
||||||
|
foreach (ManagementObject mo in searcher.Get())
|
||||||
|
{
|
||||||
|
hardDiskSerialNumber = mo["SerialNumber"].ToString().Trim();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return hardDiskSerialNumber;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 获取网卡id
|
||||||
|
/// </summary>
|
||||||
|
public static string GetNetCardMACAddress()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL) AND (Manufacturer <> 'Microsoft'))");
|
||||||
|
string netCardMACAddress = "";
|
||||||
|
foreach (ManagementObject mo in searcher.Get())
|
||||||
|
{
|
||||||
|
netCardMACAddress = mo["MACAddress"].ToString().Trim();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return netCardMACAddress;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace formula_manage.UserClass
|
||||||
|
{
|
||||||
|
internal class IniFile
|
||||||
|
{
|
||||||
|
public class IniFiles
|
||||||
|
{
|
||||||
|
public string path;
|
||||||
|
[DllImport("kernel32")] //返回0表示失败,非0为成功
|
||||||
|
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
|
||||||
|
[DllImport("kernel32")] //返回取得字符串缓冲区的长度
|
||||||
|
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
|
||||||
|
/// <summary>
|
||||||
|
/// 保存ini文件的路径
|
||||||
|
/// 调用示例:var ini = IniFiles("C:\file.ini");
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="INIPath"></param>
|
||||||
|
public IniFiles(string iniPath)
|
||||||
|
{
|
||||||
|
this.path = iniPath;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 写Ini文件
|
||||||
|
/// 调用示例:ini.IniWritevalue("Server","name","localhost");
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Section">[缓冲区]</param>
|
||||||
|
/// <param name="Key">键</param>
|
||||||
|
/// <param name="value">值</param>
|
||||||
|
public void IniWritevalue(string Section, string Key, string value)
|
||||||
|
{
|
||||||
|
WritePrivateProfileString(Section, Key, value, this.path);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 读Ini文件
|
||||||
|
/// 调用示例:ini.IniWritevalue("Server","name");
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Section">[缓冲区]</param>
|
||||||
|
/// <param name="Key">键</param>
|
||||||
|
/// <returns>值</returns>
|
||||||
|
public string IniReadvalue(string Section, string Key)
|
||||||
|
{
|
||||||
|
StringBuilder temp = new StringBuilder(255);
|
||||||
|
|
||||||
|
int i = GetPrivateProfileString(Section, Key, "", temp, 255, this.path);
|
||||||
|
return temp.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
using System.Text;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Media;
|
||||||
|
|
||||||
|
namespace formula_manage.UserClass
|
||||||
|
{
|
||||||
|
public static class LogDataRead
|
||||||
|
{
|
||||||
|
private const int MaxCount = 1000;
|
||||||
|
private static int Count = 0;
|
||||||
|
private static RichTextBox textControl;
|
||||||
|
private static InlineCollection inlines;
|
||||||
|
|
||||||
|
//设置主控件
|
||||||
|
public static void SetTextControl(RichTextBox _textBox)
|
||||||
|
{
|
||||||
|
textControl = _textBox;
|
||||||
|
Paragraph graph = new Paragraph();
|
||||||
|
inlines = graph.Inlines;
|
||||||
|
textControl.Document.Blocks.Add(graph);
|
||||||
|
}
|
||||||
|
|
||||||
|
//输出黑色消息
|
||||||
|
public static void Info(string format, params object[] args)
|
||||||
|
{
|
||||||
|
AppendText(Brushes.Black, format, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
//输出绿色消息
|
||||||
|
public static void Suc(string format, params object[] args)
|
||||||
|
{
|
||||||
|
AppendText(Brushes.DarkGreen, format, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
//输出黄色消息
|
||||||
|
public static void Warning(string format, params object[] args)
|
||||||
|
{
|
||||||
|
AppendText(Brushes.DarkOrange, format, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
//输出红色消息
|
||||||
|
public static void Error(string format, params object[] args)
|
||||||
|
{
|
||||||
|
AppendText(Brushes.Red, format, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
//清除日志
|
||||||
|
public static void Clear()
|
||||||
|
{
|
||||||
|
Count = 0;
|
||||||
|
inlines.Clear();
|
||||||
|
textControl.ScrollToEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AppendText(Brush color, string format, params object[] args)
|
||||||
|
{
|
||||||
|
textControl.BeginChange();
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
builder.Append("[");
|
||||||
|
builder.Append(Count++);
|
||||||
|
builder.Append("] : ");
|
||||||
|
builder.Append(string.Format(format, (object[])args));
|
||||||
|
builder.Append("\n");
|
||||||
|
string str = builder.ToString();
|
||||||
|
inlines.Add(new Run(str) { Foreground = color });
|
||||||
|
if (inlines.Count > MaxCount)
|
||||||
|
{
|
||||||
|
inlines.Remove(inlines.FirstInline);
|
||||||
|
}
|
||||||
|
textControl.ScrollToEnd();
|
||||||
|
textControl.EndChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace formula_manage.UserClass
|
||||||
|
{
|
||||||
|
public class LogGing
|
||||||
|
{
|
||||||
|
public static void LogGingDATA(string dat)
|
||||||
|
{
|
||||||
|
string logpath = System.Environment.CurrentDirectory + "\\Log";//日志文件目录
|
||||||
|
string logPath = "" + System.Environment.CurrentDirectory + "\\Log\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";//日志文件
|
||||||
|
string Log_time = "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "]:";
|
||||||
|
|
||||||
|
if (Directory.Exists(logpath))//检查日志路径
|
||||||
|
{
|
||||||
|
if (!File.Exists(logPath))//检查日志文件并写入启动日志
|
||||||
|
{
|
||||||
|
FileStream fs = new FileStream(logPath, FileMode.CreateNew, FileAccess.Write);//创建写入文件
|
||||||
|
StreamWriter wr = new StreamWriter(fs);//创建文件
|
||||||
|
wr.WriteLine(Log_time + dat);
|
||||||
|
wr.Close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FileStream fs = new FileStream(logPath, FileMode.Append, FileAccess.Write);
|
||||||
|
StreamWriter wr = new StreamWriter(fs);//创建文件
|
||||||
|
wr.WriteLine(Log_time + dat);
|
||||||
|
wr.Close(); }
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DirectoryInfo directoryInfo = new DirectoryInfo(logpath);
|
||||||
|
directoryInfo.Create();//创建日志路径
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
using System;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace formula_manage.UserClass
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// MD5加密
|
||||||
|
/// </summary>
|
||||||
|
internal class MD5check
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 16位MD5加密
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string MD5Encrypt16(string password)
|
||||||
|
{
|
||||||
|
var md5 = new MD5CryptoServiceProvider();
|
||||||
|
string t2 = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(password)), 4, 8);
|
||||||
|
t2 = t2.Replace("-", "");
|
||||||
|
return t2;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 32位MD5加密
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string MD5Encrypt32(string password)
|
||||||
|
{
|
||||||
|
string cl = password;
|
||||||
|
string pwd = "";
|
||||||
|
MD5 md5 = MD5.Create(); //实例化一个md5对像
|
||||||
|
// 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
|
||||||
|
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
|
||||||
|
// 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
|
||||||
|
for (int i = 0; i < s.Length; i++)
|
||||||
|
{
|
||||||
|
// 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
|
||||||
|
pwd = pwd + s[i].ToString("X");
|
||||||
|
}
|
||||||
|
return pwd;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 64位MD5加密
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string MD5Encrypt64(string password)
|
||||||
|
{
|
||||||
|
string cl = password;
|
||||||
|
//string pwd = "";
|
||||||
|
MD5 md5 = MD5.Create(); //实例化一个md5对像
|
||||||
|
// 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
|
||||||
|
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
|
||||||
|
return Convert.ToBase64String(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace formula_manage.UserClass
|
||||||
|
{
|
||||||
|
internal class PressKey
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 键盘模拟
|
||||||
|
/// </summary>
|
||||||
|
[DllImport("user32.dll", SetLastError = true)]
|
||||||
|
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
|
||||||
|
public static void PressKeys(Keys key, bool up)
|
||||||
|
{
|
||||||
|
const int KEYEVENTF_EXTENDEDKEY = 0x1;
|
||||||
|
const int KEYEVENTF_KEYUP = 0x2;
|
||||||
|
if (up)
|
||||||
|
{
|
||||||
|
keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace formula_manage.UserClass
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 字符串转数字
|
||||||
|
/// </summary>
|
||||||
|
internal class StrToInt
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 十六进制字符串转十进制
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str">十六进制字符</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static int To16Convert10(string str)
|
||||||
|
{
|
||||||
|
int res = 0;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
str = str.Trim().Replace(" ", ""); //移除空字符
|
||||||
|
//方法1
|
||||||
|
res = int.Parse(str, System.Globalization.NumberStyles.AllowHexSpecifier);
|
||||||
|
//方法2
|
||||||
|
//int r2 = System.Int32.Parse(str, System.Globalization.NumberStyles.HexNumber);
|
||||||
|
//Console.WriteLine(r2);
|
||||||
|
//方法3
|
||||||
|
//int r3 = Convert.ToInt32(str, 16);
|
||||||
|
//Console.WriteLine(r3);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,186 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Data;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace formula_manage.UserClass
|
||||||
|
{
|
||||||
|
public class TCPServer
|
||||||
|
{
|
||||||
|
public static string infoR;
|
||||||
|
//第一步:调用socket()函数创建一个用于通信的套接字
|
||||||
|
public static Socket listenSocket;
|
||||||
|
|
||||||
|
//字典集合:存储IP和Socket的集合
|
||||||
|
public static Dictionary<string, Socket> OnLineList = new Dictionary<string, Socket>();
|
||||||
|
|
||||||
|
|
||||||
|
//当前时间
|
||||||
|
private string CurrentTime
|
||||||
|
{
|
||||||
|
get { return DateTime.Now.ToString("HH:mm:ss") + Environment.NewLine; }
|
||||||
|
}
|
||||||
|
|
||||||
|
//编码格式
|
||||||
|
public static Encoding econding = Encoding.UTF8;
|
||||||
|
|
||||||
|
public static void Start()
|
||||||
|
{
|
||||||
|
//第一步:调用socket()函数创建一个用于通信的套接字
|
||||||
|
listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||||
|
//第二步:给已经创建的套接字绑定一个端口号,这一般通过设置网络套接口地址和调用Bind()函数来实现
|
||||||
|
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(UserClass.get_local_ip_address.IP_Address()), int.Parse("11080"));
|
||||||
|
UserClass.LogGing.LogGingDATA("NativeIP = " + UserClass.get_local_ip_address.IP_Address());
|
||||||
|
UserClass.LogGing.LogGingDATA("NativePORT = 11080");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
listenSocket.Bind(endPoint);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UserClass.LogGing.LogGingDATA("TCP_NotStart");
|
||||||
|
UserClass.LogGing.LogGingDATA(ex.Message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//第三步:调用listen()函数使套接字成为一个监听套接字
|
||||||
|
listenSocket.Listen(10);
|
||||||
|
//ShowMessage("服务器开启成功");
|
||||||
|
|
||||||
|
//开启一个线程监听
|
||||||
|
Task.Run(new Action(() => { ListenConnection(); }));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ListenConnection()
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
Socket clientSocket = listenSocket.Accept();
|
||||||
|
string ip = clientSocket.RemoteEndPoint.ToString();
|
||||||
|
//更新在线列表
|
||||||
|
// AddOnLine(ip, true);
|
||||||
|
//更新在线列表集合
|
||||||
|
OnLineList.Add(ip, clientSocket);
|
||||||
|
UserClass.LogGing.LogGingDATA("IP_Online = " + ip);
|
||||||
|
// ShowMessage(ip + "上线了");
|
||||||
|
Task.Run(() => ReceiveMsg(clientSocket));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 接收方法
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="clientSocket"></param>
|
||||||
|
public static void ReceiveMsg(Socket clientSocket)
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
//定义一个2M的缓冲区
|
||||||
|
byte[] buffer = new byte[1024 * 1024 * 10];
|
||||||
|
|
||||||
|
int length = -1;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
length = clientSocket.Receive(buffer);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
//客户端下线了
|
||||||
|
//更新在线列表
|
||||||
|
string ip = clientSocket.RemoteEndPoint.ToString();
|
||||||
|
UserClass.LogGing.LogGingDATA("IP_Line = " + ip);
|
||||||
|
// AddOnLine(ip, false);
|
||||||
|
OnLineList.Remove(ip); //移除ip
|
||||||
|
break; //退出循环
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length == 0)
|
||||||
|
{
|
||||||
|
//客户端下线了
|
||||||
|
//更新在线列表
|
||||||
|
string ip = clientSocket.RemoteEndPoint.ToString();
|
||||||
|
UserClass.LogGing.LogGingDATA("IP_Line = " + ip);
|
||||||
|
// AddOnLine(ip, false);
|
||||||
|
OnLineList.Remove(ip);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
infoR = econding.GetString(buffer, 0, length);
|
||||||
|
//ShowMessage(info);
|
||||||
|
string ip = clientSocket.RemoteEndPoint.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
/// <summary>
|
||||||
|
/// 在线列表更新
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="clientIp"></param>
|
||||||
|
/// <param name="value"></param>
|
||||||
|
private void AddOnLine(string clientIp, bool value)
|
||||||
|
{
|
||||||
|
Invoke(new Action(() =>
|
||||||
|
{
|
||||||
|
if (value)
|
||||||
|
{
|
||||||
|
this.lst_Online.Items.Add(clientIp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.lst_Online.Items.Remove(clientIp);
|
||||||
|
}
|
||||||
|
|
||||||
|
}));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 更新接收区
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="info"></param>
|
||||||
|
private void ShowMessage(string info)
|
||||||
|
{
|
||||||
|
Invoke(new Action(() =>
|
||||||
|
{
|
||||||
|
this.txt_Rcv.AppendText(CurrentTime + info + Environment.NewLine);
|
||||||
|
}));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
/// <summary>
|
||||||
|
/// 消息发送
|
||||||
|
/// </summary>
|
||||||
|
public static void Bn_Send(string IP, string DAT)
|
||||||
|
{
|
||||||
|
if (OnLineList.ContainsKey(IP))
|
||||||
|
{
|
||||||
|
OnLineList[IP].Send(econding.GetBytes(DAT));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 群发功能
|
||||||
|
/// </summary>
|
||||||
|
public static void Btn_SendAll(string DAT)
|
||||||
|
{
|
||||||
|
foreach (string item in OnLineList.Keys.ToArray())
|
||||||
|
{
|
||||||
|
if (OnLineList.ContainsKey(item))
|
||||||
|
{
|
||||||
|
OnLineList[item].Send(econding.GetBytes(DAT));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
using System.Net.NetworkInformation;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
|
||||||
|
namespace formula_manage.UserClass
|
||||||
|
{
|
||||||
|
public class get_local_ip_address
|
||||||
|
{
|
||||||
|
public static string getLocalIPAddressWithNetworkInterface(NetworkInterfaceType _type)//获取本机ip并以字符串方式返回
|
||||||
|
{
|
||||||
|
string output = "";
|
||||||
|
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
|
||||||
|
{
|
||||||
|
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
|
||||||
|
{
|
||||||
|
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
|
||||||
|
{
|
||||||
|
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
|
||||||
|
{
|
||||||
|
output = ip.Address.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string IP_Address()
|
||||||
|
{
|
||||||
|
string ip;
|
||||||
|
|
||||||
|
ip = getLocalIPAddressWithNetworkInterface(NetworkInterfaceType.Ethernet);
|
||||||
|
if (ip == "") ip = getLocalIPAddressWithNetworkInterface(NetworkInterfaceType.Wireless80211);
|
||||||
|
if (ip == "") ip = getLocalIPAddressWithNetworkInterface(NetworkInterfaceType.Ppp);
|
||||||
|
if (ip == "") ip = getLocalIPAddressWithNetworkInterface(NetworkInterfaceType.Wwanpp);
|
||||||
|
if (ip == "") ip = getLocalIPAddressWithNetworkInterface(NetworkInterfaceType.TokenRing);
|
||||||
|
if (ip == "") ip = getLocalIPAddressWithNetworkInterface(NetworkInterfaceType.Fddi);
|
||||||
|
if (ip == "") ip = getLocalIPAddressWithNetworkInterface(NetworkInterfaceType.GenericModem);
|
||||||
|
if (ip == "") ip = getLocalIPAddressWithNetworkInterface(NetworkInterfaceType.IPOverAtm);
|
||||||
|
if (ip == "") ip = getLocalIPAddressWithNetworkInterface(NetworkInterfaceType.Tunnel);
|
||||||
|
if (ip == "") ip = getLocalIPAddressWithNetworkInterface(NetworkInterfaceType.Unknown);
|
||||||
|
|
||||||
|
if (ip == "") ip = "127.0.0.1";
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user