chr
2024-10-09 1f645778ae80a3a8801b8bb4d0fcf8feb244ad43
完善项目,新增插件启用检测;
32个文件已修改
77个文件已添加
1 文件已重命名
14101 ■■■■■ 已修改文件
.vs/SwPlugin/v17/DocumentLayout.backup.json 142 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/SwPlugin/v17/DocumentLayout.json 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
AutoUpdater/AutoUpdater.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
AutoUpdater/MainWindow.xaml.cs 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CustomRictBox/PdmSwPlugin.UI.csproj 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CustomRictBox/SB .xaml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CustomRictBox/SB .xaml.cs 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
InnoSetupScript/InnoSetupUtil.dll 补丁 | 查看 | 原始文档 | blame | 历史
InnoSetupScript/PdmSwPlugin.iss 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmAlert/.vs/PdmAlert/v17/DocumentLayout.backup.json 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmAlert/.vs/PdmAlert/v17/DocumentLayout.json 189 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmAlert/PdmAlert.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSw/PdmSw.csproj 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSw/SwAddin.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSw/log4net.config 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/.vs/PdmSwPlugin.Common.csproj.dtbcache.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Entity/DrawAudit/DrawAudit.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/PdmSwPlugin.Common.csproj 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Style/LinkButton.xaml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Util/BinUtil.cs 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Common/Util/Encryptor.cs 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.DrawApprove/DrawApprove.xaml 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.DrawApprove/DrawAuditHisControl.xaml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.DrawApprove/DrawAuditHisControl.xaml.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/Constant/PluginConst.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/LoginControl.xaml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/LoginControl.xaml.cs 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/MainControl.xaml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/MainControl.xaml.cs 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/MainTab.xaml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/MainTab.xaml.cs 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/PdmSwPlugin.Main.csproj 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/SwAddIn/MainControl.cs 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.Main/Tcp/TcpReqInfo.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.MaterialSelect/PdmSwPlugin.MaterialSelect.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PDM/PdmControl.xaml.cs 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PDM/PdmSwPlugin.PDM.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/CommonSettingControl.xaml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginLisener/.vs/PluginLisener.csproj.dtbcache.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginLisener/.vs/PluginLisener/v17/DocumentLayout.backup.json 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginLisener/.vs/PluginLisener/v17/DocumentLayout.json 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginLisener/App.config 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginLisener/PluginLisener.Designer.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginLisener/PluginLisener.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginLisener/PluginLisener.csproj 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginLisener/Program.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginLisener/ProjectInstaller.Designer.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginLisener/ProjectInstaller.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginLisener/ProjectInstaller.resx 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginLisener/Properties/AssemblyInfo.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginLisener/packages.config 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/.vs/PluginListener/v17/DocumentLayout.json 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/Alert.xaml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/Alert.xaml.cs 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/App.config 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/Intercepter.cs 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/Listener.cs 392 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/PluginListener.csproj 245 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/Program.cs 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/Properties/AssemblyInfo.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/Properties/Resources.Designer.cs 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/Properties/Resources.resx 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/Properties/Settings.Designer.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/Properties/Settings.settings 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/Properties/app.manifest 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/Util.cs 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/WindowUtil.cs 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/log4net.config 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/packages.config 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/supersocket.cmd 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PluginListener/supersocket.sh 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListener/App.config 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListener/App.xaml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListener/App.xaml.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListener/Listener.cs 355 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListener/Properties/AssemblyInfo.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListener/Properties/Resources.Designer.cs 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListener/Properties/Resources.resx 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListener/Properties/Settings.Designer.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListener/Properties/Settings.settings 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListener/SolidWorksListener.csproj 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListener/WindowUtil.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListener/log4net.config 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListener/packages.config 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListenerAlert/App.config 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListenerAlert/App.xaml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListenerAlert/App.xaml.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListenerAlert/MainWindow.xaml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListenerAlert/MainWindow.xaml.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListenerAlert/Properties/AssemblyInfo.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListenerAlert/Properties/Resources.Designer.cs 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListenerAlert/Properties/Resources.resx 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListenerAlert/Properties/Settings.Designer.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListenerAlert/Properties/Settings.settings 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SolidWorksListenerAlert/SolidWorksListenerAlert.csproj 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WpfUI/.vs/WpfUI.csproj.dtbcache.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WpfUI/Window1.xaml.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/SuperSocket.Common.XML 1346 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/SuperSocket.Common.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/SuperSocket.Facility.XML 601 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/SuperSocket.Facility.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/SuperSocket.SocketBase.XML 5405 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/SuperSocket.SocketBase.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/SuperSocket.SocketEngine.XML 1291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/SuperSocket.SocketEngine.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/_log4net.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/_log4net.xml 补丁 | 查看 | 原始文档 | blame | 历史
lib/log4net.dll 补丁 | 查看 | 原始文档 | blame | 历史
.vs/SwPlugin/v17/DocumentLayout.backup.json
@@ -3,16 +3,36 @@
  "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{44BCE7B9-F984-426B-9997-FC1FB1A49CC0}|CustomRictBox\\PdmSwPlugin.UI.csproj|d:\\workspace\\pdmswplugin2\\customrictbox\\customrichbox.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{44BCE7B9-F984-426B-9997-FC1FB1A49CC0}|CustomRictBox\\PdmSwPlugin.UI.csproj|solutionrelative:customrictbox\\customrichbox.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.drawapprove\\drawapprove.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|solutionrelative:pdmswplugin.drawapprove\\drawapprove.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{44BCE7B9-F984-426B-9997-FC1FB1A49CC0}|CustomRictBox\\PdmSwPlugin.UI.csproj|d:\\workspace\\pdmswplugin2\\customrictbox\\customrichbox.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{44BCE7B9-F984-426B-9997-FC1FB1A49CC0}|CustomRictBox\\PdmSwPlugin.UI.csproj|solutionrelative:customrictbox\\customrichbox.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|solutionrelative:pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.drawapprove\\drawapprove.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|solutionrelative:pdmswplugin.drawapprove\\drawapprove.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|solutionrelative:pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|d:\\workspace\\pdmswplugin2\\pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|solutionrelative:pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.main\\swaddin\\maincontrol.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\swaddin\\maincontrol.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.main\\eventhandler\\baseattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\eventhandler\\baseattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|d:\\workspace\\pdmswplugin2\\pdmsw\\log4net.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
      "RelativeMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|solutionrelative:pdmsw\\log4net.config||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
    }
  ],
  "DocumentGroupContainers": [
@@ -26,40 +46,104 @@
          "Children": [
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "DrawApprove.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
              "RelativeToolTip": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
              "ViewState": "AgIAAIcBAAAAAAAAAAAcwJYBAAANAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-04T04:19:25.271Z",
              "DocumentIndex": 2,
              "Title": "DrawApprove.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
              "RelativeToolTip": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2024-10-09T03:31:27.843Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "CustomRichBox.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\CustomRictBox\\CustomRichBox.xaml",
              "RelativeDocumentMoniker": "CustomRictBox\\CustomRichBox.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\CustomRictBox\\CustomRichBox.xaml",
              "RelativeToolTip": "CustomRictBox\\CustomRichBox.xaml",
              "DocumentIndex": 1,
              "Title": "PdmControl.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.PDM\\PdmControl.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml",
              "RelativeToolTip": "PdmSwPlugin.PDM\\PdmControl.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2024-09-04T02:32:36.605Z",
              "WhenOpened": "2024-10-09T03:30:57.686Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "CustomRichBox.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\CustomRictBox\\CustomRichBox.xaml.cs",
              "RelativeDocumentMoniker": "CustomRictBox\\CustomRichBox.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\CustomRictBox\\CustomRichBox.xaml.cs",
              "RelativeToolTip": "CustomRictBox\\CustomRichBox.xaml.cs",
              "ViewState": "AgIAAMgBAAAAAAAAAAAuwBACAAAxAAAAAAAAAA==",
              "Title": "DrawApprove.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
              "RelativeToolTip": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
              "ViewState": "AgIAAAYCAAAAAAAAAAAkwCICAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-04T02:27:06.101Z",
              "WhenOpened": "2024-10-09T03:22:18.864Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 7,
              "Title": "log4net.config",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\log4net.config",
              "RelativeDocumentMoniker": "PdmSw\\log4net.config",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\log4net.config",
              "RelativeToolTip": "PdmSw\\log4net.config",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA0AAAAQAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000601|",
              "WhenOpened": "2024-09-26T10:24:04.161Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "Title": "SwAddin.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
              "RelativeDocumentMoniker": "PdmSw\\SwAddin.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
              "RelativeToolTip": "PdmSw\\SwAddin.cs",
              "ViewState": "AgIAACIAAAAAAAAAAAA5wCkAAAAvAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-26T08:51:00.927Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "Title": "BaseAttacher.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
              "RelativeToolTip": "PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
              "ViewState": "AgIAAKoAAAAAAAAAAAA0wMcAAAApAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-25T09:56:45.504Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 5,
              "Title": "MainControl.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "RelativeToolTip": "PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "ViewState": "AgIAAIwAAAAAAAAAAAA+wOQAAABDAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-25T09:54:37.505Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "PdmControl.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.PDM\\PdmControl.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml.cs",
              "RelativeToolTip": "PdmSwPlugin.PDM\\PdmControl.xaml.cs",
              "ViewState": "AgIAAM0EAAAAAAAAAAAAAOEEAAAvAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-25T06:09:00.747Z",
              "EditorCaption": ""
            }
          ]
.vs/SwPlugin/v17/DocumentLayout.json
@@ -3,20 +3,24 @@
  "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.main\\constant\\pluginconst.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\constant\\pluginconst.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|solutionrelative:pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{44BCE7B9-F984-426B-9997-FC1FB1A49CC0}|CustomRictBox\\PdmSwPlugin.UI.csproj|d:\\workspace\\pdmswplugin2\\customrictbox\\customrichbox.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{44BCE7B9-F984-426B-9997-FC1FB1A49CC0}|CustomRictBox\\PdmSwPlugin.UI.csproj|solutionrelative:customrictbox\\customrichbox.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|solutionrelative:pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.drawapprove\\drawapprove.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{BE239D32-7253-4D19-8793-159E98545B55}|PdmSwPlugin.DrawApprove\\PdmSwPlugin.DrawApprove.csproj|solutionrelative:pdmswplugin.drawapprove\\drawapprove.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|d:\\workspace\\pdmswplugin2\\pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|solutionrelative:pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{44BCE7B9-F984-426B-9997-FC1FB1A49CC0}|CustomRictBox\\PdmSwPlugin.UI.csproj|d:\\workspace\\pdmswplugin2\\customrictbox\\customrichbox.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{44BCE7B9-F984-426B-9997-FC1FB1A49CC0}|CustomRictBox\\PdmSwPlugin.UI.csproj|solutionrelative:customrictbox\\customrichbox.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.main\\swaddin\\maincontrol.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\swaddin\\maincontrol.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.main\\eventhandler\\baseattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\eventhandler\\baseattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -26,57 +30,70 @@
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 0,
          "SelectedChildIndex": 4,
          "Children": [
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "PluginConst.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
              "RelativeToolTip": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-04T04:59:17.992Z",
              "DocumentIndex": 1,
              "Title": "PdmControl.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml",
              "RelativeDocumentMoniker": "PdmSwPlugin.PDM\\PdmControl.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml",
              "RelativeToolTip": "PdmSwPlugin.PDM\\PdmControl.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2024-10-09T03:30:57.686Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "DrawApprove.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
              "RelativeToolTip": "PdmSwPlugin.DrawApprove\\DrawApprove.xaml.cs",
              "ViewState": "AgIAAIcBAAAAAAAAAAAcwJYBAAANAAAAAAAAAA==",
              "Title": "SwAddin.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
              "RelativeDocumentMoniker": "PdmSw\\SwAddin.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
              "RelativeToolTip": "PdmSw\\SwAddin.cs",
              "ViewState": "AgIAACIAAAAAAAAAAAA5wCkAAAAvAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-04T04:19:25.271Z",
              "WhenOpened": "2024-09-26T08:51:00.927Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "Title": "BaseAttacher.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
              "RelativeToolTip": "PdmSwPlugin.Main\\EventHandler\\BaseAttacher.cs",
              "ViewState": "AgIAAKoAAAAAAAAAAAA0wMcAAAApAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-25T09:56:45.504Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "CustomRichBox.xaml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\CustomRictBox\\CustomRichBox.xaml",
              "RelativeDocumentMoniker": "CustomRictBox\\CustomRichBox.xaml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\CustomRictBox\\CustomRichBox.xaml",
              "RelativeToolTip": "CustomRictBox\\CustomRichBox.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2024-09-04T02:32:36.605Z",
              "Title": "MainControl.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "RelativeToolTip": "PdmSwPlugin.Main\\SwAddIn\\MainControl.cs",
              "ViewState": "AgIAAIwAAAAAAAAAAAA+wOQAAABDAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-25T09:54:37.505Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "CustomRichBox.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\CustomRictBox\\CustomRichBox.xaml.cs",
              "RelativeDocumentMoniker": "CustomRictBox\\CustomRichBox.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\CustomRictBox\\CustomRichBox.xaml.cs",
              "RelativeToolTip": "CustomRictBox\\CustomRichBox.xaml.cs",
              "ViewState": "AgIAAMgBAAAAAAAAAAAuwM4BAABAAAAAAAAAAA==",
              "DocumentIndex": 0,
              "Title": "PdmControl.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml.cs",
              "RelativeDocumentMoniker": "PdmSwPlugin.PDM\\PdmControl.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml.cs",
              "RelativeToolTip": "PdmSwPlugin.PDM\\PdmControl.xaml.cs",
              "ViewState": "AgIAANAEAAAAAAAAAAAAAOIEAAAZAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-04T02:27:06.101Z",
              "WhenOpened": "2024-09-25T06:09:00.747Z",
              "EditorCaption": ""
            }
          ]
AutoUpdater/AutoUpdater.csproj
@@ -41,7 +41,7 @@
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\x64\Debug\</OutputPath>
    <OutputPath>..\PdmSw\bin\x64\Debug\AutoUpdater\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <DebugType>full</DebugType>
    <PlatformTarget>x64</PlatformTarget>
AutoUpdater/MainWindow.xaml.cs
@@ -7,6 +7,7 @@
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows;
using VersionControl;
@@ -91,6 +92,58 @@
                GetCurrentVersion();
                // 检查插件的更新
                CheckPluginUpdate();
            }
        }
        public void KillProcessByFullPath(string exePath)
        {
            string exeName = Path.GetFileNameWithoutExtension(exePath);
            Process[] ps = Process.GetProcessesByName(exeName);
            if (ps.Length > 0)
            {
                foreach (Process p in ps)
                {
                    if (new Uri(p.MainModule.FileName) == new Uri(exePath))
                    {
                        p.Kill();
                    }
                }
            }
        }
        /// <summary>
        /// 终止两个Listener相关进程
        /// </summary>
        public void KillListenerProcess()
        {
            string dir = Path.GetDirectoryName(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
            string path1 = Path.Combine(dir, "Listener", "SolidWorksListener.exe");
            string path2 = Path.Combine(dir, "Alert.exe");
            KillProcessByFullPath(path1);
            // 暂停一秒不然AlertKill不掉
            Thread.Sleep(1000);
            KillProcessByFullPath(path2);
        }
        /// <summary>
        /// 启动Listener相关进程
        /// </summary>
        public void StartListenerProcess()
        {
            string dir = Path.GetDirectoryName(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
            string path1 = Path.Combine(dir, "Listener", "SolidWorksListener.exe");
            if (File.Exists(path1))
            {
                ProcessStartInfo info = new ProcessStartInfo
                {
                    FileName = path1,
                    WorkingDirectory = Path.GetDirectoryName(path1)
                };
                new Process
                {
                    StartInfo = info
                }.Start();
            }
        }
@@ -235,6 +288,11 @@
            label.Content = "下载完成,解压中,请勿关闭程序...";
            // 临时解压目录,防止解压出错
            InitUnZipDir();
            // kill掉监听程序,避免文件占用
            KillListenerProcess();
            // 等待一秒释放exe占用
            Thread.Sleep(1000);
            // 插件文件夹 默认在 AutoUpdater.exe 的上级目录中
            string pluginDir = new DirectoryInfo(TempDir).Parent.Parent.FullName;
            using (ZipInputStream zipIn = new ZipInputStream(File.Open(localFilePath, FileMode.Open)))
@@ -274,6 +332,8 @@
        private void DoFinished()
        {
            // 启动监听进程
            StartListenerProcess();
            label.Content = "更新完成";
            bar.IsIndeterminate = false;
            if (SwAppPath != null)
CustomRictBox/PdmSwPlugin.UI.csproj
@@ -69,6 +69,9 @@
    <Reference Include="PresentationFramework" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="SB .xaml.cs">
      <DependentUpon>SB .xaml</DependentUpon>
    </Compile>
    <Compile Include="Sb.cs" />
    <Page Include="Resources\Icons.xaml">
      <Generator>MSBuild:Compile</Generator>
@@ -84,6 +87,10 @@
      <DependentUpon>CustomRichBox.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <Page Include="SB .xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Properties\AssemblyInfo.cs">
CustomRictBox/SB .xaml
New file
@@ -0,0 +1,19 @@
<UserControl x:Class="PdmSwPlugin.UI.SB"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:PdmSwPlugin.UI"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <ComboBox Text="{Binding SelectedText}" IsEditable="True" ItemsSource="{Binding Path=BookExs}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <CheckBox IsChecked="{Binding IsChecked}" />
                    <TextBlock Text="{Binding Book.Name}" />
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
</UserControl>
CustomRictBox/SB .xaml.cs
New file
@@ -0,0 +1,104 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows.Controls;
namespace PdmSwPlugin.UI
{
    /// <summary>
    /// SB.xaml 的交互逻辑
    /// </summary>
    public partial class SB : UserControl, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void RaisePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        public SB()
        {
            InitializeComponent();
        }
        private string _selectedText = string.Empty;
        public string SelectedText
        {
            get
            {
                return _selectedText;
            }
            set
            {
                if (_selectedText != value)
                {
                    _selectedText = value;
                    RaisePropertyChanged("SelectedText");
                }
            }
        }
        private ObservableCollection<INotifyPropertyChanged> _dataSource;
        public ObservableCollection<INotifyPropertyChanged> DataSource
        {
            get
            {
                if (_dataSource == null)
                {
                    _dataSource = new ObservableCollection<INotifyPropertyChanged>();
                    _dataSource.CollectionChanged += (sender, e) =>
                    {
                        if (e.OldItems != null)
                        {
                            foreach (INotifyPropertyChanged bookEx in e.OldItems)
                            {
                                bookEx.PropertyChanged -= ItemPropertyChanged;
                            }
                        }
                        if (e.NewItems != null)
                        {
                            foreach (INotifyPropertyChanged bookEx in e.NewItems)
                            {
                                bookEx.PropertyChanged += ItemPropertyChanged;
                            }
                        }
                    };
                }
                return _dataSource;
            }
        }
        private void ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            /*if (e.PropertyName == "IsChecked")
            {
                BookEx bookEx = sender as BookEx;
                if (bookEx != null)
                {
                    IEnumerable<BookEx> bookExs = BookExs.Where(b => b.IsChecked == true);
                    StringBuilder builder = new StringBuilder();
                    foreach (BookEx item in bookExs)
                    {
                        builder.Append(item.Book.Name + " ");
                    }
                    SelectedText = builder == null ? string.Empty : builder.ToString();
                }
            }*/
        }
    }
}
InnoSetupScript/InnoSetupUtil.dll
Binary files differ
InnoSetupScript/PdmSwPlugin.iss
@@ -3,16 +3,16 @@
; AppName
#define AppName = "PdmSwPlugin"
; 打包的应用文件夹路径
#define AppDir = "C:\Workspace\PdmSwPlugin2\PdmSw\bin\x64\Release\"
#define AppDir = "D:\Workspace\PdmSwPlugin2\PdmSw\bin\x64\Release\"
; 自动更新程序路径
#define AutoUpdaterDir = "C:\Workspace\PdmSwPlugin2\PdmSw\bin\x64\Release\Release\AutoUpdater\"
#define AutoUpdaterDir = "D:\Workspace\PdmSwPlugin2\PdmSw\bin\x64\Release\AutoUpdater\"
; 版本
#define Version = "_0.0.0.40"
#define Version = "_0.0.0.42"
; 生成的Installer存放路径
#define OutPutDir = "Z:\Main\Workspace\Output"
#define OutPutDir = "Z:\Output"
#define DllName = "PdmSwPlugin.dll"
#define MyAppExeName "SolidWorksListener.exe"
[Setup]
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
@@ -35,12 +35,14 @@
WizardStyle=modern
PrivilegesRequired=admin
UsedUserAreasWarning=no
AlwaysRestart=yes
[Languages]
Name: "chinesesimplified"; MessagesFile: "compiler:Languages\ChineseSimplified.isl"
[Files]
Source: "{#AppDir}*"; DestDir: "{app}"; Excludes: "temp\*,Log\*"; Flags:recursesubdirs ignoreversion
;Source: "InnoSetupUtil.dll"; DestDir: "{app}"
;Source: "{#AutoUpdaterDir}*"; DestDir: "{app}\AutoUpdater"; Excludes: "download\*"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
@@ -49,6 +51,7 @@
[Run]  
Filename: {dotnet4064}\RegAsm.exe; Parameters: /codebase {#DllName}; WorkingDir: {app}; Flags: runhidden nowait skipifsilent;
Filename: {app}\Listener\SolidWorksListener.exe; WorkingDir: {app}\Listener\; Flags: runhidden nowait skipifsilent;
[UninstallRun]
Filename: {dotnet4064}\RegAsm.exe; Parameters: /unregister {#DllName}; WorkingDir: {app}; RunOnceId: DelService; Flags: runhidden nowait;
@@ -68,11 +71,78 @@
Root: HKLM64; Subkey: "SOFTWARE\SolidWorks\Addins\{{{#AppId}}"; ValueType: dword; ValueName: ""; ValueData: 0; Flags: deletevalue
Root: HKLM64; Subkey: "SOFTWARE\SolidWorks\Addins\{{{#AppId}}"; ValueType: string; ValueName: "Description"; ValueData: "PDM插件"; Flags: deletevalue
Root: HKLM64; Subkey: "SOFTWARE\SolidWorks\Addins\{{{#AppId}}"; ValueType: string; ValueName: "Title"; ValueData: "PdmSw"; Flags: deletevalue
; 监听器
;Root: HKLM64; Subkey: "SYSTEM\CurrentControlSet\Services\SolidWorks Listener"; Flags: uninsdeletekey
;Root: HKLM64; Subkey: "SYSTEM\CurrentControlSet\Services\SolidWorks Listener"; ValueType: string; ValueName: "DisplayName"; ValueData: "SolidWorks Listener"; Flags: deletevalue
;Root: HKLM64; Subkey: "SYSTEM\CurrentControlSet\Services\SolidWorks Listener"; ValueType: string; ValueName: "ObjectName"; ValueData: "LocalSystem"; Flags: deletevalue
;Root: HKLM64; Subkey: "SYSTEM\CurrentControlSet\Services\SolidWorks Listener"; ValueType: string; ValueName: "ImagePath"; ValueData: "{app}\Listener\PluginListener.exe"; Flags: deletevalue
;Root: HKLM64; Subkey: "SYSTEM\CurrentControlSet\Services\SolidWorks Listener"; ValueType: dword; ValueName: "ErrorControl"; ValueData: 1; Flags: deletevalue
;Root: HKLM64; Subkey: "SYSTEM\CurrentControlSet\Services\SolidWorks Listener"; ValueType: dword; ValueName: "Start"; ValueData: 2; Flags: deletevalue
;Root: HKLM64; Subkey: "SYSTEM\CurrentControlSet\Services\SolidWorks Listener"; ValueType: dword; ValueName: "Type"; ValueData: 272; Flags: deletevalue
; 监听器2.0
Root: HKCU64; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "SolidWorksListener"; ValueData: """{app}\Listener\SolidWorksListener.exe"""; Flags: deletevalue uninsdeletevalue
[Icons]
Name: "{group}\{cm:UninstallProgram,Test}"; Filename: "{uninstallexe}"
[code]
// 自定义函数,终止服务
function CheckSoftRun(strExeName: String): Boolean;
// 变量定义
var ErrorCode: Integer;
var bRes: Boolean;
var cmdStr: String;  // 命令
begin
  cmdStr := Format('/c net stop "%s"', [strExeName]);
  if RegValueExists(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\SolidWorks Listener', 'ImagePath') then begin
    // 终止服务
    bRes := ShellExec('open', ExpandConstant('{cmd}'), cmdStr, '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
    if bRes then begin
      Result := true;
    end else begin
      MsgBox(ExpandConstant('{cm:checkSoftTip}'), mbCriticalError, MB_OKCANCEL);
      Result := false;
      Exit;
    end;
  end else begin
    Result := true;
  end;
end;
function CheckSoftRun3(): Boolean;
var hWnd: Integer;
var ResultCode: Integer;
var exe1: String;
var exe2: String;
begin
  // hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));
  exe1 := Format('/c powershell "Get-Process|Where-Object{$_.Path -eq \"%s\"}|Stop-Process|pause"', [ExpandConstant('{autopf}\HengXin\PdmSwPlugin\Listener\SolidWorksListener.exe')]);
  exe1 := '/c taskkill /f /t /im SolidWorksListener.exe';
  exe2 := '/c taskkill /f /t /im Alert.exe';
  ShellExec('open', ExpandConstant('{cmd}'), exe1, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
  ShellExec('open', ExpandConstant('{cmd}'), exe2, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
  Result:= true;
end;
// 开始页下一步时判断软件是否运行
function NextButtonClick(CurPageID: Integer): Boolean;
begin
  if 1=CurPageID then begin
      Result := CheckSoftRun3();
      Exit;
  end;
  Result:= true;
end;
// 卸载时关闭软件
function InitializeUninstall(): Boolean;
begin
  Result := CheckSoftRun3();
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usDone then
@@ -82,3 +152,7 @@
end;
[CustomMessages]
chinesesimplified.checkSoftTip=未能成功停止服务!
PdmAlert/.vs/PdmAlert/v17/DocumentLayout.backup.json
New file
@@ -0,0 +1,102 @@
{
  "Version": 1,
  "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{00000000-0000-0000-0000-000000000000}|\u003CSolution\u003E|PdmAlert||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|"
    },
    {
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\app.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|solutionrelative:app.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\settings\\updatersetting.xml||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
      "RelativeMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|solutionrelative:settings\\updatersetting.xml||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\settings\\toolsetting.xml||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
      "RelativeMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|solutionrelative:settings\\toolsetting.xml||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\loginwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|solutionrelative:loginwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|d:\\workspace\\pdmswplugin2\\pdmalert\\||{B270807C-D8C6-49EB-8EBE-8E8D566637A1}|1e78f8db-6c07-4d61-a18f-7514010abd56"
    }
  ],
  "DocumentGroupContainers": [
    {
      "Orientation": 0,
      "VerticalTabListWidth": 256,
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 0,
          "Children": [
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "PdmAlert",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\PdmAlert.csproj",
              "RelativeDocumentMoniker": "PdmAlert.csproj",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\PdmAlert.csproj",
              "RelativeToolTip": "PdmAlert.csproj",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|",
              "WhenOpened": "2024-09-09T08:52:34.897Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "App.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\App.xaml.cs",
              "RelativeDocumentMoniker": "App.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\App.xaml.cs",
              "RelativeToolTip": "App.xaml.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAoAAAABAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-09T08:48:00.369Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "UpdaterSetting.xml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\Settings\\UpdaterSetting.xml",
              "RelativeDocumentMoniker": "Settings\\UpdaterSetting.xml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\Settings\\UpdaterSetting.xml",
              "RelativeToolTip": "Settings\\UpdaterSetting.xml",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003576|",
              "WhenOpened": "2024-09-09T08:47:51.476Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "ToolSetting.xml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\Settings\\ToolSetting.xml",
              "RelativeDocumentMoniker": "Settings\\ToolSetting.xml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\Settings\\ToolSetting.xml",
              "RelativeToolTip": "Settings\\ToolSetting.xml",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003576|",
              "WhenOpened": "2024-09-09T08:47:46.282Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "Title": "LoginWindow.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\LoginWindow.xaml.cs",
              "RelativeDocumentMoniker": "LoginWindow.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\LoginWindow.xaml.cs",
              "RelativeToolTip": "LoginWindow.xaml.cs",
              "ViewState": "AgIAABMAAAAAAAAAAAAgwCUAAAAnAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-06T09:46:54.594Z"
            }
          ]
        }
      ]
    }
  ]
}
PdmAlert/.vs/PdmAlert/v17/DocumentLayout.json
@@ -1,51 +1,28 @@
{
  "Version": 1,
  "WorkspaceRootPath": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\",
  "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{00000000-0000-0000-0000-000000000000}|\u003CSolution\u003E|PdmAlert||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|"
    },
    {
      "AbsoluteMoniker": "D:0:0:{EDC73C56-D0C5-4AC9-B296-3253915EF933}|..\\..\\CommonUpdater\\VersionControl\\VersionControl.csproj|c:\\main\\workspace\\visualstudio\\commonupdater\\versioncontrol\\util.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{11C62041-5E6E-4230-A5E8-4246C033BA67}|..\\..\\CommonUpdater\\AutoUpdater\\AutoUpdater.csproj|c:\\main\\workspace\\visualstudio\\commonupdater\\autoupdater\\settings\\updatersetting.xml||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|c:\\main\\workspace\\visualstudio\\pdmswplugin2\\pdmalert\\settings\\updatersetting.xml||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
      "RelativeMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|solutionrelative:settings\\updatersetting.xml||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{11C62041-5E6E-4230-A5E8-4246C033BA67}|..\\..\\CommonUpdater\\AutoUpdater\\AutoUpdater.csproj|c:\\main\\workspace\\visualstudio\\commonupdater\\autoupdater\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{11C62041-5E6E-4230-A5E8-4246C033BA67}|..\\..\\CommonUpdater\\AutoUpdater\\AutoUpdater.csproj|c:\\main\\workspace\\visualstudio\\commonupdater\\autoupdater\\util.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|c:\\main\\workspace\\visualstudio\\pdmswplugin2\\pdmalert\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|solutionrelative:mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|c:\\main\\workspace\\visualstudio\\pdmswplugin2\\pdmalert\\app.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\app.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|solutionrelative:app.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{EDC73C56-D0C5-4AC9-B296-3253915EF933}|..\\..\\CommonUpdater\\VersionControl\\VersionControl.csproj|c:\\main\\workspace\\visualstudio\\commonupdater\\versioncontrol\\versionutil.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\settings\\updatersetting.xml||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
      "RelativeMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|solutionrelative:settings\\updatersetting.xml||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|c:\\main\\workspace\\visualstudio\\pdmswplugin2\\pdmalert\\loginwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\settings\\toolsetting.xml||{FA3CD31E-987B-443A-9B81-186104E8DAC1}",
      "RelativeMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|solutionrelative:settings\\toolsetting.xml||{FA3CD31E-987B-443A-9B81-186104E8DAC1}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\loginwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|solutionrelative:loginwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|c:\\main\\workspace\\visualstudio\\pdmswplugin2\\pdmalert\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|solutionrelative:mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|c:\\main\\workspace\\visualstudio\\pdmswplugin2\\pdmalert\\loginwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
      "RelativeMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|solutionrelative:loginwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|c:\\main\\workspace\\visualstudio\\pdmswplugin2\\pdmalert\\||{B270807C-D8C6-49EB-8EBE-8E8D566637A1}|1e78f8db-6c07-4d61-a18f-7514010abd56"
      "AbsoluteMoniker": "D:0:0:{FC7FBDE7-D0D2-4E79-A586-501ABC73FE46}|PdmAlert.csproj|d:\\workspace\\pdmswplugin2\\pdmalert\\||{B270807C-D8C6-49EB-8EBE-8E8D566637A1}|1e78f8db-6c07-4d61-a18f-7514010abd56"
    }
  ],
  "DocumentGroupContainers": [
@@ -61,154 +38,62 @@
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "PdmAlert",
              "DocumentMoniker": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\PdmAlert.csproj",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\PdmAlert.csproj",
              "RelativeDocumentMoniker": "PdmAlert.csproj",
              "ToolTip": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\PdmAlert.csproj",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\PdmAlert.csproj",
              "RelativeToolTip": "PdmAlert.csproj",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|",
              "WhenOpened": "2024-08-22T13:00:12.272Z",
              "WhenOpened": "2024-09-09T08:52:34.897Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "Util.cs",
              "DocumentMoniker": "C:\\Main\\Workspace\\VisualStudio\\CommonUpdater\\VersionControl\\Util.cs",
              "RelativeDocumentMoniker": "..\\..\\CommonUpdater\\VersionControl\\Util.cs",
              "ToolTip": "C:\\Main\\Workspace\\VisualStudio\\CommonUpdater\\VersionControl\\Util.cs",
              "RelativeToolTip": "..\\..\\CommonUpdater\\VersionControl\\Util.cs",
              "ViewState": "AQIAAIMBAAAAAAAAAAAgwKcBAAANAAAA",
              "Title": "App.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\App.xaml.cs",
              "RelativeDocumentMoniker": "App.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\App.xaml.cs",
              "RelativeToolTip": "App.xaml.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAoAAAABAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-08-22T12:56:26.502Z",
              "WhenOpened": "2024-09-09T08:48:00.369Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "UpdaterSetting.xml",
              "DocumentMoniker": "C:\\Main\\Workspace\\VisualStudio\\CommonUpdater\\AutoUpdater\\Settings\\UpdaterSetting.xml",
              "RelativeDocumentMoniker": "..\\..\\CommonUpdater\\AutoUpdater\\Settings\\UpdaterSetting.xml",
              "ToolTip": "C:\\Main\\Workspace\\VisualStudio\\CommonUpdater\\AutoUpdater\\Settings\\UpdaterSetting.xml",
              "RelativeToolTip": "..\\..\\CommonUpdater\\AutoUpdater\\Settings\\UpdaterSetting.xml",
              "ViewState": "AQIAAAAAAAAAAAAAAAAAAA8AAAARAAAA",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\Settings\\UpdaterSetting.xml",
              "RelativeDocumentMoniker": "Settings\\UpdaterSetting.xml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\Settings\\UpdaterSetting.xml",
              "RelativeToolTip": "Settings\\UpdaterSetting.xml",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003576|",
              "WhenOpened": "2024-08-22T12:57:06.965Z",
              "EditorCaption": ""
              "WhenOpened": "2024-09-09T08:47:51.476Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "UpdaterSetting.xml",
              "DocumentMoniker": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\Settings\\UpdaterSetting.xml",
              "RelativeDocumentMoniker": "Settings\\UpdaterSetting.xml",
              "ToolTip": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\Settings\\UpdaterSetting.xml",
              "RelativeToolTip": "Settings\\UpdaterSetting.xml",
              "ViewState": "AQIAAAAAAAAAAAAAAAAAAAcAAAARAAAA",
              "Title": "ToolSetting.xml",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\Settings\\ToolSetting.xml",
              "RelativeDocumentMoniker": "Settings\\ToolSetting.xml",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\Settings\\ToolSetting.xml",
              "RelativeToolTip": "Settings\\ToolSetting.xml",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003576|",
              "WhenOpened": "2024-08-22T11:46:07.203Z",
              "EditorCaption": ""
              "WhenOpened": "2024-09-09T08:47:46.282Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "Title": "MainWindow.xaml.cs",
              "DocumentMoniker": "C:\\Main\\Workspace\\VisualStudio\\CommonUpdater\\AutoUpdater\\MainWindow.xaml.cs",
              "RelativeDocumentMoniker": "..\\..\\CommonUpdater\\AutoUpdater\\MainWindow.xaml.cs",
              "ToolTip": "C:\\Main\\Workspace\\VisualStudio\\CommonUpdater\\AutoUpdater\\MainWindow.xaml.cs",
              "RelativeToolTip": "..\\..\\CommonUpdater\\AutoUpdater\\MainWindow.xaml.cs",
              "ViewState": "AQIAAKsAAAAAAAAAAAD4v7sAAAA8AAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-08-22T11:42:13.882Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 11,
              "Title": "LoginWindow.xaml",
              "DocumentMoniker": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\LoginWindow.xaml",
              "RelativeDocumentMoniker": "LoginWindow.xaml",
              "ToolTip": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\LoginWindow.xaml",
              "RelativeToolTip": "LoginWindow.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2024-08-22T11:41:42.779Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 9,
              "Title": "LoginWindow.xaml.cs",
              "DocumentMoniker": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\LoginWindow.xaml.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\LoginWindow.xaml.cs",
              "RelativeDocumentMoniker": "LoginWindow.xaml.cs",
              "ToolTip": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\LoginWindow.xaml.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmAlert\\LoginWindow.xaml.cs",
              "RelativeToolTip": "LoginWindow.xaml.cs",
              "ViewState": "AQIAAAAAAAAAAAAAAAAAAAkAAAASAAAA",
              "ViewState": "AgIAABMAAAAAAAAAAAAgwCUAAAAnAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-08-22T11:38:26.763Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 5,
              "Title": "Util.cs",
              "DocumentMoniker": "C:\\Main\\Workspace\\VisualStudio\\CommonUpdater\\AutoUpdater\\Util.cs",
              "RelativeDocumentMoniker": "..\\..\\CommonUpdater\\AutoUpdater\\Util.cs",
              "ToolTip": "C:\\Main\\Workspace\\VisualStudio\\CommonUpdater\\AutoUpdater\\Util.cs",
              "RelativeToolTip": "..\\..\\CommonUpdater\\AutoUpdater\\Util.cs",
              "ViewState": "AQIAAGoAAAAAAAAAAAAkwKAAAAAFAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-08-22T11:14:30.598Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 8,
              "Title": "VersionUtil.cs",
              "DocumentMoniker": "C:\\Main\\Workspace\\VisualStudio\\CommonUpdater\\VersionControl\\VersionUtil.cs",
              "RelativeDocumentMoniker": "..\\..\\CommonUpdater\\VersionControl\\VersionUtil.cs",
              "ToolTip": "C:\\Main\\Workspace\\VisualStudio\\CommonUpdater\\VersionControl\\VersionUtil.cs",
              "RelativeToolTip": "..\\..\\CommonUpdater\\VersionControl\\VersionUtil.cs",
              "ViewState": "AQIAAGwAAAAAAAAAAAAAAAgAAAAjAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-08-22T10:35:18.104Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "Title": "MainWindow.xaml.cs",
              "DocumentMoniker": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\MainWindow.xaml.cs",
              "RelativeDocumentMoniker": "MainWindow.xaml.cs",
              "ToolTip": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\MainWindow.xaml.cs",
              "RelativeToolTip": "MainWindow.xaml.cs",
              "ViewState": "AQIAAMMAAAAAAAAAAAAnwNcAAAAJAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-08-22T10:31:21.777Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 10,
              "Title": "MainWindow.xaml",
              "DocumentMoniker": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\MainWindow.xaml",
              "RelativeDocumentMoniker": "MainWindow.xaml",
              "ToolTip": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\MainWindow.xaml",
              "RelativeToolTip": "MainWindow.xaml",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
              "WhenOpened": "2024-08-22T10:31:19.726Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 7,
              "Title": "App.xaml.cs",
              "DocumentMoniker": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\App.xaml.cs",
              "RelativeDocumentMoniker": "App.xaml.cs",
              "ToolTip": "C:\\Main\\Workspace\\VisualStudio\\PdmSwPlugin2\\PdmAlert\\App.xaml.cs",
              "RelativeToolTip": "App.xaml.cs",
              "ViewState": "AQIAAGwAAAAAAAAAAAAywHIAAAANAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-08-22T10:29:45.832Z",
              "EditorCaption": ""
              "WhenOpened": "2024-09-06T09:46:54.594Z"
            }
          ]
        }
PdmAlert/PdmAlert.csproj
@@ -179,7 +179,7 @@
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <PropertyGroup>
    <PostBuildEvent>xcopy "C:\Main\Workspace\VisualStudio\CommonUpdater\AutoUpdater\bin\x64\$(ConfigurationName)\" "$(TargetDir)AutoUpdater\" /S /Y
    <PostBuildEvent>xcopy "D:\Workspace\CommonUpdater\AutoUpdater\bin\x64\$(ConfigurationName)\" "$(TargetDir)AutoUpdater\" /S /Y
IF "$(ConfigurationName)"=="Release" GOTO PRE
GOTO END
@@ -189,7 +189,7 @@
GOTO END
:END
xcopy "$(TargetDir)Settings\UpdaterSetting.xml" "$(TargetDir)AutoUpdater\Settings\UpdaterSetting.xml" /Y
echo f| xcopy "$(TargetDir)Settings\UpdaterSetting.xml" "$(TargetDir)AutoUpdater\Settings\UpdaterSetting.xml" /E /Y
</PostBuildEvent>
  </PropertyGroup>
PdmSw/PdmSw.csproj
@@ -163,6 +163,20 @@
      <Private>True</Private>
      <EmbedInteropTypes>False</EmbedInteropTypes>
    </Reference>
    <Reference Include="SuperSocket.Common, Version=1.6.6.1, Culture=neutral, PublicKeyToken=6c80000676988ebb, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\lib\SuperSocket.Common.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.Facility">
      <HintPath>..\lib\SuperSocket.Facility.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.SocketBase, Version=1.6.6.1, Culture=neutral, PublicKeyToken=6c80000676988ebb, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\lib\SuperSocket.SocketBase.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.SocketEngine">
      <HintPath>..\lib\SuperSocket.SocketEngine.dll</HintPath>
    </Reference>
    <Reference Include="System">
      <Name>System</Name>
      <EmbedInteropTypes>False</EmbedInteropTypes>
PdmSw/SwAddin.cs
@@ -1,6 +1,7 @@
using log4net;
using log4net.Appender;
using log4net.Config;
using log4net.Core;
using PdmSwPlugin.Common;
using PdmSwPlugin.Common.Setting;
using PdmSwPlugin.Main;
@@ -33,7 +34,6 @@
    {
        static SwAddin()
        {
            // AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
            // AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += CurrentDomain_AssemblyResolve;
            /// 设置log4net配置
@@ -329,6 +329,7 @@
        {
            RemoveCommandMgr();
            RemovePMP();
            mainControl.StopTcpServer();
            attacher.DetachEventHandlers();
            attacher = null;
PdmSw/log4net.config
@@ -11,11 +11,12 @@
  <!-- 文件存储日志配置 -->
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <!-- 保存文件的名称 -->
    <file value="${SwPluginPath}/Log/" />
        <file value="./Log/" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="'log_'yyyyMMdd'.log'"/>
    <staticLogFileName value="false"/>
        <!--<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />-->
    <!-- 文件的编码方式 -->
    <param name="Encoding" value="UTF-8"/>
@@ -25,7 +26,7 @@
    <maxSizeRollBackups value="2" />
    <!-- 日志输出格式 -->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date{ISO8601} [%logger]  %level  %class - %message%newline" />
            <conversionPattern value="%date{ISO8601} [%logger] [%thread] %level %class - %message%newline" />
    </layout>
  </appender>
PdmSwPlugin.Common/.vs/PdmSwPlugin.Common.csproj.dtbcache.json
@@ -1 +1 @@
{"RootPath":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common","ProjectFileName":"PdmSwPlugin.Common.csproj","Configuration":"Debug|AnyCPU","FrameworkPath":"","Sources":[{"SourceFile":"Attribute\\PdmSwPlugin.cs"},{"SourceFile":"BomIniter\\NameUtil.cs"},{"SourceFile":"BomIniter\\YwtBomIniter.cs"},{"SourceFile":"ClassLoader.cs"},{"SourceFile":"Constants\\PriceCheckName.cs"},{"SourceFile":"Constants\\PropertyName.cs"},{"SourceFile":"Constants\\Settings.cs"},{"SourceFile":"Control\\RichHisWindow.xaml.cs"},{"SourceFile":"Control\\TreeGrid\\Controls\\TreeDataGrid.cs"},{"SourceFile":"Control\\TreeGrid\\Controls\\TreeGrid.cs"},{"SourceFile":"Control\\TreeGrid\\Controls\\TreeItemContentControl.cs"},{"SourceFile":"Control\\TreeGrid\\Controls\\TreeItemData.cs"},{"SourceFile":"Entity\\BusinessType.cs"},{"SourceFile":"Entity\\DrawAudit\\DrawAudit.cs"},{"SourceFile":"Entity\\DrawAudit\\DrawAuditHis.cs"},{"SourceFile":"Entity\\DrawAudit\\DrawAuditOrder.cs"},{"SourceFile":"Entity\\NoteAndPos.cs"},{"SourceFile":"Entity\\NotifyBase.cs"},{"SourceFile":"Entity\\Page.cs"},{"SourceFile":"Entity\\PartSpec.cs"},{"SourceFile":"Entity\\PdmPart.cs"},{"SourceFile":"BomIniter\\BomIniter.cs"},{"SourceFile":"BomIniter\\BomIniterHolder.cs"},{"SourceFile":"BomIniter\\LHJBomIniter.cs"},{"SourceFile":"Interface\\IContectSelectionChangeHandler.cs"},{"SourceFile":"Interface\\IContextHandler.cs"},{"SourceFile":"Setting\\PluginSetting.cs"},{"SourceFile":"Entity\\Pdm\\PdmBom.cs"},{"SourceFile":"Entity\\PluginInfo.cs"},{"SourceFile":"Entity\\PropertyInfo_2D.cs"},{"SourceFile":"Entity\\SldComponentInfo_DM.cs"},{"SourceFile":"Entity\\System\\PdmUser.cs"},{"SourceFile":"Event\\Events.cs"},{"SourceFile":"Exception\\PdmException.cs"},{"SourceFile":"Interface\\Base\\ActiveDocChangeHandlerBase.cs"},{"SourceFile":"Interface\\IActiveDocChangeHandler.cs"},{"SourceFile":"Interface\\ISwAppSetter.cs"},{"SourceFile":"properties\\AssemblyInfo.cs"},{"SourceFile":"Setting\\CustomerSetting.cs"},{"SourceFile":"Setting\\YwtUserSetting.cs"},{"SourceFile":"Util\\DictionaryUtil.cs"},{"SourceFile":"Util\\LimitedConcurrencyLevelTaskScheduler.cs"},{"SourceFile":"Util\\NumberUtil.cs"},{"SourceFile":"Util\\OpenDocContext.cs"},{"SourceFile":"Util\\Pdm\\ComponentAndTask.cs"},{"SourceFile":"Util\\Pdm\\BomTreeReader.cs"},{"SourceFile":"Util\\Permission\\PermissionUtil.cs"},{"SourceFile":"Util\\SwDMUtil.cs"},{"SourceFile":"Util\\UI\\MaskAdorner.cs"},{"SourceFile":"Util\\Common\\BeanUtil.cs"},{"SourceFile":"Util\\Common\\MsgBoxHelper.cs"},{"SourceFile":"Util\\CustomPropertyUtil.cs"},{"SourceFile":"Util\\DMSldFileExtentionChecker.cs"},{"SourceFile":"Util\\CustomerPropertiesWrapper.cs"},{"SourceFile":"Util\\Common\\DocUtil.cs"},{"SourceFile":"Util\\EngineeringDrawingFile.cs"},{"SourceFile":"Util\\EngineeringDrawingPropertiesClass.cs"},{"SourceFile":"Util\\FileExtentionChecker.cs"},{"SourceFile":"Util\\Common\\FileUtil.cs"},{"SourceFile":"Util\\GetDocumentPropertiesViaDM.cs"},{"SourceFile":"Util\\Http\\GlobalExceptionHandler.cs"},{"SourceFile":"Util\\Http\\HttpClientCreator.cs"},{"SourceFile":"Util\\Http\\HttpUtil.cs"},{"SourceFile":"Util\\Http\\Result.cs"},{"SourceFile":"Util\\Common\\JsonUtil.cs"},{"SourceFile":"Util\\Common\\MD5Util.cs"},{"SourceFile":"Util\\Pdm\\ModelUtil.cs"},{"SourceFile":"Util\\UI\\MultiExWindow.xaml.cs"},{"SourceFile":"Util\\WindowIntPtrUtil.cs"},{"SourceFile":"Util\\Xml\\XmlUtil.cs"},{"SourceFile":"obj\\Debug\\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs"},{"SourceFile":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\obj\\Debug\\Util\\UI\\MultiExWindow.g.cs"},{"SourceFile":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\obj\\Debug\\GeneratedInternalTypeHelper.g.cs"}],"References":[{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\IIS\\Microsoft Web Deploy V3\\Newtonsoft.Json.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\CustomRictBox\\bin\\Debug\\PdmSwPlugin.UI.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":"D:\\Workspace\\PdmSwPlugin2\\CustomRictBox\\bin\\Debug\\PdmSwPlugin.UI.dll"},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\PresentationCore.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\PresentationFramework.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.sldworks.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.swconst.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.swdocumentmgr.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Configuration.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Web.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xaml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\WindowsBase.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\bin\\Debug\\PdmSwPlugin.Common.dll","OutputItemRelativePath":"PdmSwPlugin.Common.dll"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}
{"RootPath":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common","ProjectFileName":"PdmSwPlugin.Common.csproj","Configuration":"Debug|x64","FrameworkPath":"","Sources":[{"SourceFile":"Attribute\\PdmSwPlugin.cs"},{"SourceFile":"BomIniter\\NameUtil.cs"},{"SourceFile":"BomIniter\\YwtBomIniter.cs"},{"SourceFile":"ClassLoader.cs"},{"SourceFile":"Constants\\PriceCheckName.cs"},{"SourceFile":"Constants\\PropertyName.cs"},{"SourceFile":"Constants\\Settings.cs"},{"SourceFile":"Control\\RichHisWindow.xaml.cs"},{"SourceFile":"Control\\TreeGrid\\Controls\\TreeDataGrid.cs"},{"SourceFile":"Control\\TreeGrid\\Controls\\TreeGrid.cs"},{"SourceFile":"Control\\TreeGrid\\Controls\\TreeItemContentControl.cs"},{"SourceFile":"Control\\TreeGrid\\Controls\\TreeItemData.cs"},{"SourceFile":"Entity\\BusinessType.cs"},{"SourceFile":"Entity\\DrawAudit\\DrawAudit.cs"},{"SourceFile":"Entity\\DrawAudit\\DrawAuditHis.cs"},{"SourceFile":"Entity\\DrawAudit\\DrawAuditOrder.cs"},{"SourceFile":"Entity\\NoteAndPos.cs"},{"SourceFile":"Entity\\NotifyBase.cs"},{"SourceFile":"Entity\\Page.cs"},{"SourceFile":"Entity\\PartSpec.cs"},{"SourceFile":"Entity\\PdmPart.cs"},{"SourceFile":"BomIniter\\BomIniter.cs"},{"SourceFile":"BomIniter\\BomIniterHolder.cs"},{"SourceFile":"BomIniter\\LHJBomIniter.cs"},{"SourceFile":"Interface\\IContectSelectionChangeHandler.cs"},{"SourceFile":"Interface\\IContextHandler.cs"},{"SourceFile":"Setting\\PluginSetting.cs"},{"SourceFile":"Entity\\Pdm\\PdmBom.cs"},{"SourceFile":"Entity\\PluginInfo.cs"},{"SourceFile":"Entity\\PropertyInfo_2D.cs"},{"SourceFile":"Entity\\SldComponentInfo_DM.cs"},{"SourceFile":"Entity\\System\\PdmUser.cs"},{"SourceFile":"Event\\Events.cs"},{"SourceFile":"Exception\\PdmException.cs"},{"SourceFile":"Interface\\Base\\ActiveDocChangeHandlerBase.cs"},{"SourceFile":"Interface\\IActiveDocChangeHandler.cs"},{"SourceFile":"Interface\\ISwAppSetter.cs"},{"SourceFile":"properties\\AssemblyInfo.cs"},{"SourceFile":"Setting\\CustomerSetting.cs"},{"SourceFile":"Setting\\YwtUserSetting.cs"},{"SourceFile":"Util\\BinUtil.cs"},{"SourceFile":"Util\\DictionaryUtil.cs"},{"SourceFile":"Util\\Encryptor.cs"},{"SourceFile":"Util\\LimitedConcurrencyLevelTaskScheduler.cs"},{"SourceFile":"Util\\NumberUtil.cs"},{"SourceFile":"Util\\OpenDocContext.cs"},{"SourceFile":"Util\\Pdm\\ComponentAndTask.cs"},{"SourceFile":"Util\\Pdm\\BomTreeReader.cs"},{"SourceFile":"Util\\Permission\\PermissionUtil.cs"},{"SourceFile":"Util\\SwDMUtil.cs"},{"SourceFile":"Util\\UI\\MaskAdorner.cs"},{"SourceFile":"Util\\Common\\BeanUtil.cs"},{"SourceFile":"Util\\Common\\MsgBoxHelper.cs"},{"SourceFile":"Util\\CustomPropertyUtil.cs"},{"SourceFile":"Util\\DMSldFileExtentionChecker.cs"},{"SourceFile":"Util\\CustomerPropertiesWrapper.cs"},{"SourceFile":"Util\\Common\\DocUtil.cs"},{"SourceFile":"Util\\EngineeringDrawingFile.cs"},{"SourceFile":"Util\\EngineeringDrawingPropertiesClass.cs"},{"SourceFile":"Util\\FileExtentionChecker.cs"},{"SourceFile":"Util\\Common\\FileUtil.cs"},{"SourceFile":"Util\\GetDocumentPropertiesViaDM.cs"},{"SourceFile":"Util\\Http\\GlobalExceptionHandler.cs"},{"SourceFile":"Util\\Http\\HttpClientCreator.cs"},{"SourceFile":"Util\\Http\\HttpUtil.cs"},{"SourceFile":"Util\\Http\\Result.cs"},{"SourceFile":"Util\\Common\\JsonUtil.cs"},{"SourceFile":"Util\\Common\\MD5Util.cs"},{"SourceFile":"Util\\Pdm\\ModelUtil.cs"},{"SourceFile":"Util\\UI\\MultiExWindow.xaml.cs"},{"SourceFile":"Util\\WindowIntPtrUtil.cs"},{"SourceFile":"Util\\Xml\\XmlUtil.cs"},{"SourceFile":"obj\\x64\\Debug\\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs"},{"SourceFile":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\obj\\x64\\Debug\\Control\\RichHisWindow.g.cs"},{"SourceFile":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\obj\\x64\\Debug\\Util\\UI\\MultiExWindow.g.cs"},{"SourceFile":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\obj\\x64\\Debug\\GeneratedInternalTypeHelper.g.cs"}],"References":[{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\Newtonsoft.Json.13.0.3\\lib\\net45\\Newtonsoft.Json.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\CustomRictBox\\bin\\x64\\Debug\\PdmSwPlugin.UI.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":"D:\\Workspace\\PdmSwPlugin2\\CustomRictBox\\bin\\x64\\Debug\\PdmSwPlugin.UI.dll"},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\PresentationCore.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\PresentationFramework.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.sldworks.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.swconst.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.swdocumentmgr.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Configuration.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Web.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xaml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\WindowsBase.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\bin\\x64\\Debug\\PdmSwPlugin.Common.dll","OutputItemRelativePath":"PdmSwPlugin.Common.dll"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}
PdmSwPlugin.Common/Entity/DrawAudit/DrawAudit.cs
@@ -45,6 +45,14 @@
            set { _status = value; }
        }
        private string _statusArr;
        public string statusArr
        {
            get { return _statusArr; }
            set { _statusArr = value; }
        }
        public string d3Md5 { get; set; }
        public string d3RelativePath { get; set; }
        public string d2Md5 { get; set; }
PdmSwPlugin.Common/PdmSwPlugin.Common.csproj
@@ -101,7 +101,9 @@
    <Compile Include="properties\AssemblyInfo.cs" />
    <Compile Include="Setting\CustomerSetting.cs" />
    <Compile Include="Setting\YwtUserSetting.cs" />
    <Compile Include="Util\BinUtil.cs" />
    <Compile Include="Util\DictionaryUtil.cs" />
    <Compile Include="Util\Encryptor.cs" />
    <Compile Include="Util\LimitedConcurrencyLevelTaskScheduler.cs" />
    <Compile Include="Util\NumberUtil.cs" />
    <Compile Include="Util\OpenDocContext.cs" />
@@ -153,10 +155,6 @@
    </Reference>
    <Reference Include="SolidWorks.Interop.swdocumentmgr">
      <HintPath>C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\api\redist\SolidWorks.Interop.swdocumentmgr.dll</HintPath>
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </Reference>
    <Reference Include="SolidWorks.Interop.swpublished">
      <HintPath>..\..\..\..\..\Program Files\SOLIDWORKS Corp\SOLIDWORKS\api\redist\SolidWorks.Interop.swpublished.dll</HintPath>
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </Reference>
    <Reference Include="System">
PdmSwPlugin.Common/Style/LinkButton.xaml
@@ -27,4 +27,28 @@
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="RButton" TargetType="{x:Type Button}" >
        <Style.Resources>
            <SolidColorBrush x:Key="TextColor">RED</SolidColorBrush>
        </Style.Resources>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ButtonBase}">
                    <ContentPresenter x:Name="buttonContent" TextBlock.FontSize="{TemplateBinding FontSize}"
                    TextBlock.FontFamily="{StaticResource iconfont}"
                    TextBlock.Foreground="{StaticResource TextColor}"
                    Margin="0,0,5,0"
                    VerticalAlignment="Center"
                    HorizontalAlignment="Center"
                    Content="{TemplateBinding Content}"/>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="buttonContent" Property="TextBlock.Foreground" Value="Purple"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
PdmSwPlugin.Common/Util/BinUtil.cs
New file
@@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace PdmSwPlugin.Common.Util
{
    public class BinUtil
    {
        /// <summary>
        /// 把明文密码加密后以二进制存入bin文件中
        /// TODO 使用机器码加密
        /// </summary>
        /// <param name="content">字符内容</param>
        /// <param name="filePath">存放路径</param>
        public static void SaveStrToBin(string content, string filePath = null)
        {
            if (string.IsNullOrEmpty(filePath))
            {
                filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().FullName), "bin");
            }
            byte[] bytes = Convert.FromBase64String(content);
            using (Stream stream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
            using (BinaryWriter writer = new BinaryWriter(stream))
            {
                writer.Write(bytes);
            }
        }
        /// <summary>
        /// 从bin中加载字符串
        /// </summary>
        /// <param name="content">字符串内容</param>
        /// <param name="filePath">bin文件路径</param>
        /// <returns>读取是否成功</returns>
        public static bool LoadStrFromBin(ref string content, string filePath = null)
        {
            if (string.IsNullOrEmpty(filePath))
            {
                filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().FullName), "bin");
            }
            if (!File.Exists(filePath))
            {
                return false;
            }
            using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            using (BinaryReader reader = new BinaryReader(stream))
            {
                byte[] bytes = new byte[stream.Length];
                reader.Read(bytes, 0, bytes.Length);
                content = Convert.ToBase64String(bytes);
                return true;
            }
        }
    }
}
PdmSwPlugin.Common/Util/Encryptor.cs
New file
@@ -0,0 +1,69 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace PdmSwPlugin.Common.Util
{
    /// <summary>
    /// 字符加解密
    /// </summary>
    public class Encryptor
    {
        private readonly byte[] key;
        private readonly byte[] iv;
        public Encryptor(string keyString, string ivString)
        {
            key = Encoding.UTF8.GetBytes(keyString);
            iv = Encoding.UTF8.GetBytes(ivString);
        }
        public string Encrypt(string plainText)
        {
            using (var aes = Aes.Create())
            {
                aes.Key = key;
                aes.IV = iv;
                ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(plainText);
                        }
                        return Convert.ToBase64String(msEncrypt.ToArray());
                    }
                }
            }
        }
        public string Decrypt(string cipherText)
        {
            using (var aes = Aes.Create())
            {
                aes.Key = key;
                aes.IV = iv;
                ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
                byte[] arr = Convert.FromBase64String(cipherText);
                using (MemoryStream msDecrypt = new MemoryStream(arr))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {
                            return srDecrypt.ReadToEnd();
                        }
                    }
                }
            }
        }
    }
}
PdmSwPlugin.DrawApprove/DrawApprove.xaml
@@ -99,18 +99,31 @@
        </ResourceDictionary>
    </UserControl.Resources>
    <AdornerDecorator>
        <Grid x:Name="sb">
            <DockPanel x:Name="content" LastChildFill="True">
        <Grid x:Name="content">
            <Grid.RowDefinitions>
                <RowDefinition Height="30"/>
                <RowDefinition Height="30"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="20"/>
            </Grid.RowDefinitions>
                <ToolBarTray DockPanel.Dock="Top" Background="#FFF" ToolBarTray.IsLocked="True" >
            <ToolBarTray Grid.Row="0" DockPanel.Dock="Top" Background="#FFF" ToolBarTray.IsLocked="True" >
                    <ToolBar Style="{StaticResource CommonToolBar}" ToolBar.OverflowMode="Never" Band="1" BandIndex="1" Height="30" Background="#FFF">
                        <Button ToolTip="刷新" Content="&#xe631;刷新" FontFamily="{StaticResource iconfont}" FontSize="16"
                    Click="Button_Click"/>
                    </ToolBar>
                </ToolBarTray>
            <StackPanel Grid.Row="1" Orientation="Horizontal" DockPanel.Dock="Top" VerticalAlignment="Center">
                <Label FontSize="16">状态</Label>
                <CheckBox FontSize="16" Margin="0,0,10,0" VerticalContentAlignment="Center" x:Name="subcb" IsChecked="True">待审核</CheckBox>
                <CheckBox FontSize="16" Margin="0,0,10,0" VerticalContentAlignment="Center" x:Name="resubcb" IsChecked="True">重新审核</CheckBox>
                <CheckBox FontSize="16" Margin="0,0,10,0" VerticalContentAlignment="Center" x:Name="comcb">已完成</CheckBox>
                <CheckBox FontSize="16" Margin="0,0,20,0" VerticalContentAlignment="Center" x:Name="rejcb">已驳回</CheckBox>
            </StackPanel>
                <!-- 树结构 -->
                <treeData:TreeDataGrid x:Name="treeDataGrid" DockPanel.Dock="Top"
            <treeData:TreeDataGrid x:Name="treeDataGrid" DockPanel.Dock="Top" Grid.Row="2"
                                       ColumnWidth="*"
                               ItemsSource="{Binding dataSource,Converter={StaticResource TreeItemDataConverter},ConverterParameter=children}"
                                    AutoGenerateColumns="False"
@@ -118,6 +131,8 @@
                                    CanUserSortColumns="False"
                                       RowHeaderWidth="0"
                                       FontSize="18"
                        FrozenColumnCount="1"
                        HorizontalScrollBarVisibility="Auto"
                                    CanUserDeleteRows="False">
                    <treeData:TreeDataGrid.Resources>
@@ -152,7 +167,7 @@
                    </treeData:TreeDataGrid.CellStyle>
                    <treeData:TreeDataGrid.Columns>
                        <DataGridTemplateColumn Width="25">
                    <!--<DataGridTemplateColumn Width="25">
                            <DataGridTemplateColumn.Header>
                                <CheckBox Checked="GlobalCheckBox_Checked" Unchecked="GlobalCheckBox_Checked" />
                            </DataGridTemplateColumn.Header>
@@ -163,9 +178,9 @@
                      IsChecked="{Binding selected}" Checked="SingleCheckBox_Event" Unchecked="SingleCheckBox_Event"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
         </DataGridTemplateColumn>-->
                        <DataGridTemplateColumn Header="物料编号" IsReadOnly="True">
                    <DataGridTemplateColumn Header="物料编号" IsReadOnly="True" Width="Auto">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
@@ -178,9 +193,9 @@
                        <DataGridTextColumn Header="申请人" Width="100" IsReadOnly="True" Binding="{Binding Data.requestUser}"/>
                        <DataGridTextColumn Header="流水单号" Width="120" IsReadOnly="True" Binding="{Binding Data.orderCode}"/>
                        <DataGridTextColumn Header="前一审核人" Width="100" IsReadOnly="True" Binding="{Binding Data.auditUser}"/>
                        <DataGridTextColumn Header="提交时间" Width="180" IsReadOnly="True" Binding="{Binding Data.updateTime}"/>
                    <DataGridTextColumn Header="提交时间" Width="180" CanUserResize="False" IsReadOnly="True" Binding="{Binding Data.updateTime}"/>
                        <DataGridTemplateColumn Header="状态" Width="80" IsReadOnly="True">
                    <DataGridTemplateColumn Header="状态" Width="80" CanUserResize="False" IsReadOnly="True">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Style="{StaticResource statusSlot}" DataContext="{Binding Data}"
@@ -189,15 +204,37 @@
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTemplateColumn Header="操作" Width="280" IsReadOnly="True">
                    <DataGridTemplateColumn Header="操作" Width="280" IsReadOnly="True" CanUserResize="False">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <Button Style="{StaticResource LinkButton}" DataContext="{Binding Data}" Click="OpenDrw_Click">打开工程图</Button>
                                        <Button Style="{StaticResource LinkButton}" DataContext="{Binding Data}" Click="OpenDoc_Click">打开图纸</Button>
                                    <StackPanel Orientation="Horizontal" Name="groupStack">
                                        <Button Style="{StaticResource LinkButton}" DataContext="{Binding Data}" Click="Resolve_Click">通过</Button>
                                        <Button Style="{StaticResource RLink}" DataContext="{Binding Data}" Margin="0" Click="Reject_Click">不通过</Button>
                                    </StackPanel>
                                    <Button Name="resetButton" Style="{StaticResource LinkButton}" DataContext="{Binding Data}" Click="Reset_Click">撤销</Button>
                                </StackPanel>
                                <DataTemplate.Triggers>
                                    <DataTrigger Binding="{Binding Data.status}" Value="completed">
                                        <Setter TargetName="groupStack" Property="Visibility" Value="Collapsed"/>
                                        <Setter TargetName="resetButton" Property="Visibility" Value="Visible"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding Data.status}" Value="rejected">
                                        <Setter TargetName="groupStack" Property="Visibility" Value="Collapsed"/>
                                        <Setter TargetName="resetButton" Property="Visibility" Value="Visible"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding Data.status}" Value="submitted">
                                        <Setter TargetName="groupStack" Property="Visibility" Value="Visible"/>
                                        <Setter TargetName="resetButton" Property="Visibility" Value="Collapsed"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding Data.status}" Value="resubmitted">
                                        <Setter TargetName="groupStack" Property="Visibility" Value="Visible"/>
                                        <Setter TargetName="resetButton" Property="Visibility" Value="Collapsed"/>
                                    </DataTrigger>
                                </DataTemplate.Triggers>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
@@ -206,7 +243,7 @@
                    </treeData:TreeDataGrid.Columns>
                </treeData:TreeDataGrid>
                <StatusBar DockPanel.Dock="Bottom" Height="20">
            <StatusBar Grid.Row="3" DockPanel.Dock="Top" Height="20">
                    <StatusBarItem >
                        <TextBox x:Name="activeDocPath" IsReadOnly="True" Style="{StaticResource StatusBarTextBox}" Text="{Binding SelectBomText}"/>
                    </StatusBarItem>
@@ -216,8 +253,9 @@
                    </StatusBarItem>
                </StatusBar>
                <Border></Border>
                <!--<TextBox x:Name="console"></TextBox>-->
            </DockPanel>
            <!--<DockPanel x:Name="content" LastChildFill="True">
                --><!--<TextBox x:Name="console"></TextBox>--><!--
            </DockPanel>-->
        </Grid>
    </AdornerDecorator>
</UserControl>
PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs
@@ -167,6 +167,7 @@
                    Dispatcher.Invoke(() =>
                    {
                        dataSource = new ObservableCollection<DrawAudit>(datas);
                    });
                }
                catch (Exception ex)
@@ -298,7 +299,23 @@
        {
            try
            {
                Result<List<DrawAudit>> res = Client.GetSyncAction<List<DrawAudit>>("drawAudit/listWithTask");
                string statusArr = string.Empty;
                Dispatcher.Invoke(() =>
                {
                    List<string> arr = new List<string>();
                    if (subcb.IsChecked == true) arr.Add("submitted");
                    if (resubcb.IsChecked == true) arr.Add("resubmitted");
                    if (comcb.IsChecked == true) arr.Add("completed");
                    if (rejcb.IsChecked == true) arr.Add("rejected");
                    if (arr.Count > 0)
                    {
                        statusArr = $"'{string.Join("','", arr)}'";
                    }
                });
                Result<List<DrawAudit>> res = Client.GetSyncAction<List<DrawAudit>>("drawAudit/listWithTask2", new DrawAudit
                {
                    statusArr = statusArr
                });
                return res.HandleResult();
            }
            catch (Exception ex)
@@ -386,6 +403,49 @@
        }
        /// <summary>
        /// 单条数据撤销按钮点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Reset_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            DrawAudit da = btn.DataContext as DrawAudit;
            if (da.status == "submitted" && da.status == "resubmitted")
            {
                this.Warning("请选择审核过的数据");
                return;
            }
            MessageBoxResult mr = MessageBox.Show($"确定撤销物料【{da.materialCode}】的图纸审批吗?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Question);
            if (mr == MessageBoxResult.OK)
            {
                MaskAdorner.ShowMask(content, "请求中,请稍候...");
                Task.Run(() =>
                {
                    try
                    {
                        Result<object> res = Client.PostSyncAction<object>(da, "drawAudit/reset");
                        object obj = res.HandleResult();
                        // CloseAuditedDoc(da);
                        Dispatcher.Invoke(() =>
                        {
                            dataSource = new ObservableCollection<DrawAudit>(RefreshList());
                        });
                    }
                    catch (Exception ex)
                    {
                        Logger.Error($"V{PdmUser.LoginUser.pluginVersion}, Draw Reset failed.", ex);
                        this.Error($"V{PdmUser.LoginUser.pluginVersion},撤销失败!{ex.Message}");
                    }
                    finally
                    {
                        MaskAdorner.HideMask(content);
                    }
                });
            }
        }
        /// <summary>
        /// 单条数据驳回按钮点击事件
        /// </summary>
        /// <param name="sender"></param>
@@ -457,7 +517,16 @@
        public void OnSwActiveDocChange(ModelDoc2 oldDoc, ModelDoc2 newDoc, Component2 comp)
        {
            var fileName = new Uri(newDoc.GetPathName());
            string path = newDoc.GetPathName();
            Uri fileName;
            if (string.IsNullOrEmpty(path))
            {
                fileName = null;
            }
            else
            {
                fileName = new Uri(newDoc.GetPathName());
            }
            foreach (var e in dataSource)
            {
                var d2Path = new Uri(GetRealFilePath(e.d2RelativePath));
PdmSwPlugin.DrawApprove/DrawAuditHisControl.xaml
@@ -118,7 +118,16 @@
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <Button Style="{StaticResource LinkButton}" DataContext="{Binding Data}" Click="Detail_Click">审核详情</Button>
                                        <Button Style="{StaticResource RButton}" x:Name="backBtn" Visibility="Collapsed" DataContext="{Binding Data}" Click="Reback_Click">撤销</Button>
                                    </StackPanel>
                                    <DataTemplate.Triggers>
                                        <DataTrigger Binding="{Binding Data.status}" Value="submitted">
                                            <Setter Property="Visibility" TargetName="backBtn" Value="Visible"/>
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding Data.status}" Value="resubmitted">
                                            <Setter Property="Visibility" TargetName="backBtn" Value="Visible"/>
                                        </DataTrigger>
                                    </DataTemplate.Triggers>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
PdmSwPlugin.DrawApprove/DrawAuditHisControl.xaml.cs
@@ -263,6 +263,42 @@
            GetAuditHisDetailAndOpen(da);
        }
        private void Reback_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            DrawAudit da = btn.DataContext as DrawAudit;
            MessageBoxResult mr = MessageBox.Show($"确定撤销物料【{da.materialCode}】的图纸审批吗?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Question);
            if (mr == MessageBoxResult.OK)
            {
                MaskAdorner.ShowMask(content, "请求中,请稍后...");
                Task.Run(() =>
                {
                    try
                    {
                        Result<List<DrawAuditHis>> res = Client.PostSyncAction<List<DrawAuditHis>>(new DrawAudit
                        {
                            id = da.id,
                            requestUserId = PdmUser.LoginUser.id
                        }, "drawAudit/back");
                        res.HandleResult();
                        Dispatcher.Invoke(() =>
                        {
                            dataSource = new ObservableCollection<DrawAudit>(RefreshList());
                        });
                    }
                    catch (Exception ex)
                    {
                        Logger.Error("Reback Draw Audit Failed.", ex);
                        this.Error($"撤销申请失败!{ex.Message}");
                    }
                    finally
                    {
                        MaskAdorner.HideMask(content);
                    }
                });
            }
        }
        private string GetRealFilePath(string dbPath)
        {
            string fileName = Path.GetFileName(dbPath);
PdmSwPlugin.Main/Constant/PluginConst.cs
@@ -3,6 +3,6 @@
    public class PluginConst
    {
        public static readonly string AppId = "DF23E96F-A469-4302-8367-7FA2F798CD09";
        public static readonly string Version = "0.0.0.41";
        public static readonly string Version = "0.0.0.42";
    }
}
PdmSwPlugin.Main/LoginControl.xaml
New file
@@ -0,0 +1,31 @@
<UserControl x:Class="PdmSwPlugin.Main.LoginControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:PdmSwPlugin.Main"
             mc:Ignorable="d"
             Loaded="UserControl_Loaded"
             d:DesignHeight="450" d:DesignWidth="800">
    <AdornerDecorator>
        <Grid Height="200" VerticalAlignment="Top" Margin="20" x:Name="mainGrid">
            <Grid.RowDefinitions>
                <RowDefinition Height="30"/>
                <RowDefinition Height="30"/>
                <RowDefinition Height="30"/>
                <RowDefinition Height="50"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="50"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Label Content="用户名" VerticalContentAlignment="Center" Grid.Row="0" Grid.Column="0"/>
            <TextBox x:Name="usernameTextBlock" VerticalAlignment="Stretch" VerticalContentAlignment="Center" Grid.Row="0" Grid.Column="1"/>
            <Label Content="密码" VerticalContentAlignment="Center" Grid.Row="1" Grid.Column="0"/>
            <PasswordBox x:Name="passwordTextBlock" VerticalAlignment="Stretch" VerticalContentAlignment="Center" Grid.Row="1" Grid.Column="1"/>
            <CheckBox x:Name="rememberMeInput"  Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" VerticalContentAlignment="Center">自动登录</CheckBox>
            <Button Margin="0,10,0,0"  Click="Button_Click" Padding="5" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2">登录</Button>
        </Grid>
    </AdornerDecorator>
</UserControl>
PdmSwPlugin.Main/LoginControl.xaml.cs
New file
@@ -0,0 +1,206 @@
using PdmSwPlugin.Commmon.Util.UI;
using PdmSwPlugin.Common.Entity.System;
using PdmSwPlugin.Common.Util.Http;
using PdmSwPlugin.Common.Util;
using System;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.IO;
using PdmSwPlugin.Common.Interface;
using SolidWorks.Interop.sldworks;
using log4net;
using PdmSwPlugin.Common.Setting;
namespace PdmSwPlugin.Main
{
    /// <summary>
    /// LoginControl.xaml 的交互逻辑
    /// </summary>
    public partial class LoginControl : UserControl, ISwAppSetter
    {
        private static readonly Encryptor encryptor = new Encryptor("aB3dE5fG7hI9jjK1lMnOpQrS2tUvWxYz",
            "8Wq9RsT4vYx6ZuB1");
        private SldWorks swApp;
        public SldWorks SwApp => swApp;
        private ILog Logger = LogManager.GetLogger("Main");
        private PluginSetting GlobalConfig = PluginSetting.Instance;
        private Action successCallback;
        public LoginControl(Action successCallback)
        {
            this.successCallback = successCallback;
            InitializeComponent();
        }
        /// <summary>
        /// 自动登录
        /// </summary>
        /// <param name="callback"></param>
        /// <param name="reject"></param>
        private void AutoLogin(Action<PdmUser> callback, Action<Exception> reject)
        {
            MaskAdorner.ShowMask(mainGrid, "登陆中...");
            Task.Run(() =>
            {
                try
                {
                    if (GlobalConfig.ClassicLogin)
                    {
                        string binPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), "HengXin", "PdmSwPlugin", "bin");
                        if (!File.Exists(binPath))
                        {
                            callback(null);
                            return;
                        }
                        string content = null;
                        if (!BinUtil.LoadStrFromBin(ref content, binPath))
                        {
                            callback(null);
                            return;
                        }
                        try
                        {
                            PdmUser param = JsonUtil.Deserialize<PdmUser>(encryptor.Decrypt(content));
                            Result<PdmUser> res = HttpClientCreator.PostSyncAction<PdmUser>("openApi/wpf/login", new PdmUser
                            {
                                appId = PluginConst.AppId,
                                pluginVersion = PluginConst.Version,
                                username = param.username,
                                password = param.password
                            });
                            PdmUser user = res.HandleResult();
                            user.appId = PluginConst.AppId;
                            user.pluginVersion = PluginConst.Version;
                            user.password = param.password;
                            callback(user);
                        }
                        catch (Exception ex)
                        {
                            Logger.Error("Remember Me Login Failed!", ex);
                            callback(null);
                        }
                    }
                    else
                    {
                        Result<PdmUser> res = HttpClientCreator.GetSyncAction<PdmUser>("openApi/wpf/simpleLogin", new PdmUser
                        {
                            username = System.Environment.UserName,
                            appId = PluginConst.AppId,
                            pluginVersion = PluginConst.Version
                        });
                        PdmUser user = res.HandleResult();
                        user.appId = PluginConst.AppId;
                        user.pluginVersion = PluginConst.Version;
                        callback(user);
                    }
                }
                catch (Exception e)
                {
                    reject(e);
                }
                finally
                {
                    MaskAdorner.HideMask(mainGrid);
                }
            });
        }
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            AutoLogin(
            (user) =>
            {
                if (user != null)
                {
                    Dispatcher.Invoke(() =>
                    {
                        PdmUser.SetLoginUser(user);
                        if (PdmUser.HasLogin())
                        {
                            LoginSuccess();
                        }
                    });
                }
            },
            (ex) =>
            {
                Logger.Error("登陆失败!", ex);
                this.Error($"登陆失败! {ex.Message}");
            });
        }
        /// <summary>
        /// 加载插件主Tab
        /// </summary>
        public void LoginSuccess()
        {
            if (rememberMeInput.IsChecked == true)
            {
                // 勾选自动登录的处理
                string userInfo = JsonUtil.Stringfiy(PdmUser.LoginUser);
                string binDir = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), "HengXin", "PdmSwPlugin");
                if (!Directory.Exists(binDir))
                {
                    Directory.CreateDirectory(binDir);
                }
                string binPath = Path.Combine(binDir, "bin");
                BinUtil.SaveStrToBin(encryptor.Encrypt(userInfo), binPath);
            }
            successCallback();
        }
        /// <summary>
        /// 登陆点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MaskAdorner.ShowMask(mainGrid, "登陆中...");
            PdmUser param = new PdmUser
            {
                username = usernameTextBlock.Text,
                password = passwordTextBlock.Password,
                appId = PluginConst.AppId,
                pluginVersion = PluginConst.Version
            };
            Task.Run(() =>
            {
                try
                {
                    Result<PdmUser> res = HttpClientCreator.PostSyncAction<PdmUser>("openApi/wpf/login", param);
                    PdmUser user = res.HandleResult();
                    user.appId = PluginConst.AppId;
                    user.pluginVersion = PluginConst.Version;
                    user.password = param.password;
                    Dispatcher.Invoke(() =>
                    {
                        PdmUser.SetLoginUser(user);
                        if (PdmUser.HasLogin())
                        {
                            LoginSuccess();
                        }
                    });
                }
                catch (Exception ex)
                {
                    Logger.Error("登陆失败!", ex);
                    this.Error($"登陆失败! {ex.Message}");
                }
                finally
                {
                    MaskAdorner.HideMask(mainGrid);
                }
            });
        }
        public void SetSwApp(SldWorks SwApp)
        {
            this.swApp = SwApp;
        }
    }
}
PdmSwPlugin.Main/MainControl.xaml
@@ -12,29 +12,11 @@
        HorizontalContentAlignment="Stretch"
        VerticalContentAlignment="Stretch"
        VerticalAlignment="Stretch"
        Unloaded="self_Unloaded"
        Loaded="MainControl_Loaded">
    <AdornerDecorator>
        <Border x:Name="mainBorder">
            <Grid Height="200" VerticalAlignment="Top" Margin="20">
                <Grid.RowDefinitions>
                    <RowDefinition Height="30"/>
                    <RowDefinition Height="30"/>
                    <RowDefinition Height="50"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="50"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Label Content="用户名" VerticalContentAlignment="Center" Grid.Row="0" Grid.Column="0"/>
                <TextBox x:Name="usernameTextBlock" VerticalAlignment="Stretch" VerticalContentAlignment="Center" Grid.Row="0" Grid.Column="1"/>
                <Label Content="密码" VerticalContentAlignment="Center" Grid.Row="1" Grid.Column="0"/>
                <PasswordBox x:Name="passwordTextBlock" VerticalAlignment="Stretch" VerticalContentAlignment="Center" Grid.Row="1" Grid.Column="1"/>
                <Button Margin="0,10,0,0"  Click="Button_Click" Padding="5" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2">登录</Button>
            </Grid>
            <!--<TabControl x:Name="tab">
    </TabControl>-->
        </Border>
    </AdornerDecorator>
</UserControl>
PdmSwPlugin.Main/MainControl.xaml.cs
@@ -15,6 +15,9 @@
using PdmSwPlugin.Common.Interface;
using SolidWorks.Interop.sldworks;
using System.Windows.Threading;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using PdmSwPlugin.Main.Tcp;
namespace PdmSwPlugin.Main
{
@@ -24,9 +27,42 @@
    /// </summary>
    public partial class MainControl : UserControl, ISwAppSetter
    {
        private TcpServer tcpServer;
        public void InitTcpServer()
        {
            tcpServer = new TcpServer();
            tcpServer.NewRequestReceived += new RequestHandler<TcpSession, StringRequestInfo>(HandleRequest);
            if (!tcpServer.Setup(5678))
            {
                Logger.Error("Tcp Server Setup Error.");
            }
            if (!tcpServer.Start())
            {
                Logger.Error("Tcp Server Start Error.");
            }
        }
        #region 控件
        #endregion
        public void StopTcpServer()
        {
            tcpServer?.Stop();
            tcpServer = null;
        }
        public void HandleRequest(TcpSession session, StringRequestInfo info)
        {
            byte[] msg = new byte[1];
            if (PdmUser.LoginUser != null)
            {
                // 登录返回1
                msg[0] = 1;
            }
            else
            {
                // 没登录返回0
                msg[0] = 0;
            }
            session.Send(msg, 0, 1);
        }
        #region 检查更新相关
        /// <summary>
@@ -149,46 +185,6 @@
        }
        #endregion
        /// <summary>
        /// 自动登录
        /// </summary>
        /// <param name="callback"></param>
        /// <param name="reject"></param>
        private void AutoLogin(Action<PdmUser> callback, Action<Exception> reject)
        {
            MaskAdorner.ShowMask(mainBorder, "登陆中...");
            Task.Run(() =>
            {
                try
                {
                    if (GlobalConfig.ClassicLogin)
                    {
                        callback(null);
                        return;
                    }
                    Result<PdmUser> res = HttpClientCreator.GetSyncAction<PdmUser>("openApi/wpf/simpleLogin", new PdmUser
                    {
                        username = System.Environment.UserName,
                        appId = PluginConst.AppId,
                        pluginVersion = PluginConst.Version
                    });
                    PdmUser user = res.HandleResult();
                    user.appId = PluginConst.AppId;
                    user.pluginVersion = PluginConst.Version;
                    callback(user);
                }
                catch (Exception e)
                {
                    reject(e);
                }
                finally
                {
                    MaskAdorner.HideMask(mainBorder);
                }
            });
        }
        /// <summary>
        /// 加载插件主Tab
        /// </summary>
@@ -196,15 +192,29 @@
        {
            // 自动登录成功
            clientCreator = new HttpClientCreator();
            tabControl = new TabControl();
            AddPlugin();
            mainBorder.Child = tabControl;
            if (tabControl.Items.Count > 0)
            if (mainTab == null)
            {
                TabItem tabItem = tabControl.Items[0] as TabItem;
                mainTab = new MainTab(Logout);
                mainTab.SetSwApp(SwApp);
            }
            AddPlugin();
            mainBorder.Child = mainTab;
            if (mainTab.tabControl.Items.Count > 0)
            {
                TabItem tabItem = mainTab.tabControl.Items[0] as TabItem;
                tabItem.Focus();
                (tabItem.Content as UIElement).Focus();
            }
        }
        public void Logout()
        {
            string binPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), "HengXin", "PdmSwPlugin", "bin");
            File.Delete(binPath);
            DeActiveHandler();
            mainTab.tabControl.Items.Clear();
            PdmUser.SetLoginUser(null);
            mainBorder.Child = new LoginControl(LoginSuccess);
        }
        public void MainControl_Loaded(object sender, RoutedEventArgs e)
@@ -216,75 +226,19 @@
            // 最后检查更新
            CheckUpdate();
            AutoLogin(
            (user) =>
            {
                if (user != null)
                {
                    Dispatcher.Invoke(() =>
                    {
                        PdmUser.SetLoginUser(user);
                        if (PdmUser.HasLogin())
                        {
                            LoginSuccess();
                        }
                    });
                }
            },
            (ex) =>
            {
                Logger.Error("登陆失败!", ex);
                this.Error($"登陆失败! {ex.Message}");
            });
            mainBorder.Child = new LoginControl(LoginSuccess);
        }
        /// <summary>
        /// 登陆点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MaskAdorner.ShowMask(mainBorder, "登陆中...");
            PdmUser param = new PdmUser
            {
                username = usernameTextBlock.Text,
                password = passwordTextBlock.Password,
                appId = PluginConst.AppId,
                pluginVersion = PluginConst.Version
            };
            Task.Run(() =>
            {
                try
                {
                    Result<PdmUser> res = HttpClientCreator.PostSyncAction<PdmUser>("openApi/wpf/login", param);
                    PdmUser user = res.HandleResult();
                    user.appId = PluginConst.AppId;
                    user.pluginVersion = PluginConst.Version;
                    Dispatcher.Invoke(() =>
                    {
                        PdmUser.SetLoginUser(user);
                        if (PdmUser.HasLogin())
                        {
                            LoginSuccess();
                        }
                    });
                }
                catch (Exception ex)
                {
                    Logger.Error("登陆失败!", ex);
                    this.Error($"登陆失败! {ex.Message}");
                }
                finally
                {
                    MaskAdorner.HideMask(mainBorder);
                }
            });
        }
        public void SetSwApp(SldWorks SwApp)
        {
            this.SwApp = SwApp;
        }
        private void self_Unloaded(object sender, RoutedEventArgs e)
        {
            StopTcpServer();
        }
    }
}
PdmSwPlugin.Main/MainTab.xaml
New file
@@ -0,0 +1,27 @@
<UserControl x:Class="PdmSwPlugin.Main.MainTab"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:PdmSwPlugin.Main"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/PdmSwPlugin.Common;component/Style/LinkButton.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <TabControl Grid.Row="0" x:Name="tabControl"></TabControl>
        <StatusBar Grid.Row="1" Padding="0" Margin="0" VerticalContentAlignment="Center">
            <Label x:Name="userLabel" FontWeight="Bold" Padding="0" Margin="0" />
            <Button Style="{StaticResource LinkButton}" Click="Button_Click">退出登录</Button>
        </StatusBar>
    </Grid>
</UserControl>
PdmSwPlugin.Main/MainTab.xaml.cs
New file
@@ -0,0 +1,41 @@
using PdmSwPlugin.Common.Entity.System;
using PdmSwPlugin.Common.Interface;
using SolidWorks.Interop.sldworks;
using System;
using System.Windows;
using System.Windows.Controls;
using SolidWorks.Interop.swconst;
namespace PdmSwPlugin.Main
{
    /// <summary>
    /// MainTab.xaml 的交互逻辑
    /// </summary>
    public partial class MainTab : UserControl, ISwAppSetter
    {
        private Action logout;
        public MainTab(Action logout)
        {
            this.logout = logout;
            InitializeComponent();
            userLabel.Content = $"欢迎您,{PdmUser.LoginUser?.realname}";
        }
        private SldWorks swApp;
        public SldWorks SwApp => swApp;
        public void SetSwApp(SldWorks SwApp)
        {
            this.swApp = SwApp;
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (SwApp.SendMsgToUser2("确定退出登录吗?", (int)swMessageBoxIcon_e.swMbWarning,
                (int)swMessageBoxBtn_e.swMbYesNo) == (int)swMessageBoxResult_e.swMbHitYes)
            {
                logout();
            }
        }
    }
}
PdmSwPlugin.Main/PdmSwPlugin.Main.csproj
@@ -71,6 +71,18 @@
      <HintPath>C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\api\redist\SolidWorks.Interop.swconst.dll</HintPath>
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </Reference>
    <Reference Include="SuperSocket.Common">
      <HintPath>..\lib\SuperSocket.Common.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.Facility">
      <HintPath>..\lib\SuperSocket.Facility.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.SocketBase">
      <HintPath>..\lib\SuperSocket.SocketBase.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.SocketEngine">
      <HintPath>..\lib\SuperSocket.SocketEngine.dll</HintPath>
    </Reference>
    <Reference Include="System">
      <Private>True</Private>
    </Reference>
@@ -96,17 +108,32 @@
    <Compile Include="EventHandler\PartDocEventHandler.cs" />
    <Compile Include="EventHandler\DocViewEventHandler.cs" />
    <Compile Include="EventHandler\IDocEventHandler.cs" />
    <Compile Include="LoginControl.xaml.cs">
      <DependentUpon>LoginControl.xaml</DependentUpon>
    </Compile>
    <Compile Include="MainControl.xaml.cs">
      <DependentUpon>MainControl.xaml</DependentUpon>
    </Compile>
    <Compile Include="MainTab.xaml.cs">
      <DependentUpon>MainTab.xaml</DependentUpon>
    </Compile>
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="SwAddIn\MainControl.cs" />
    <Compile Include="Tcp\TcpReqInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <Page Include="LoginControl.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="MainControl.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </Page>
    <Page Include="MainTab.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
  </ItemGroup>
  <ItemGroup>
    <None Include="app.config" />
PdmSwPlugin.Main/SwAddIn/MainControl.cs
@@ -51,7 +51,7 @@
        private HttpClientCreator clientCreator { get; set; }
        private TabControl tabControl;
        private MainTab mainTab;
        public MainControl(SldWorks swAddin)
        {
@@ -59,6 +59,7 @@
            GlobalConfig = PluginSetting.Instance;
            InitializeComponent();
            self.DataContext = this;
            InitTcpServer();
        }
        // 本地调试用,连接SolidWorks
@@ -72,7 +73,7 @@
        private void AddPlugin()
        {
            tabControl.Items.Clear();
            mainTab.tabControl.Items.Clear();
            SetPluginWithPermission();
            //LoadPlugins();
            //TestWeb testWeb = new TestWeb();
@@ -90,7 +91,7 @@
            {
                // 物料优选
                MaterialSelectControl ms = new MaterialSelectControl(SwApp);
                HandlePlugin(ms, tabControl);
                HandlePlugin(ms, mainTab.tabControl);
            }
            if (permissions.Contains("PDM:PLUGIN:CONTROL:PropertySetting"))
            {
@@ -98,31 +99,32 @@
                if (CustomerSetting.Instance["customer"] == "YWT")
                {
                    CommonSettingControl cs = new CommonSettingControl(SwApp);
                    HandlePlugin(cs, tabControl);
                    HandlePlugin(cs, mainTab.tabControl);
                    cs.InitPropertyData();
                }
                else
                {
                    PropertySettingControl ps = new PropertySettingControl(SwApp);
                    HandlePlugin(ps, tabControl);
                    HandlePlugin(ps, mainTab.tabControl);
                }
            }
            if (permissions.Contains("PDM:PLUGIN:CONTROL:PDM"))
            {
                // PDM
                PdmControl pdm = new PdmControl(SwApp);
                HandlePlugin(pdm, tabControl);
                HandlePlugin(pdm, mainTab.tabControl);
            }
            if (permissions.Contains("PDM:PLUGIN:CONTROL:PriceCheck"))
            {
                // 加工件核价
                PriceCheckControl priceCheck = new PriceCheckControl(SwApp);
                HandlePlugin(priceCheck, tabControl);
                HandlePlugin(priceCheck, mainTab.tabControl);
            }
            if (permissions.Contains("PDM:PLUGIN:CONTROL:DrawApprove"))
            {
                // 图纸审核
                DrawApproveControl drawApprove = new DrawApproveControl(SwApp);
                HandlePlugin(drawApprove, tabControl);
                HandlePlugin(drawApprove, mainTab.tabControl);
                /*UserSettingControl userSettingControl = new UserSettingControl();
                HandlePlugin(userSettingControl, tabControl);*/
            }
@@ -130,7 +132,7 @@
            {
                // 图纸审核
                DrawAuditHisControl drawAuditHisControl = new DrawAuditHisControl(SwApp);
                HandlePlugin(drawAuditHisControl, tabControl);
                HandlePlugin(drawAuditHisControl, mainTab.tabControl);
                /*UserSettingControl userSettingControl = new UserSettingControl();
                HandlePlugin(userSettingControl, tabControl);*/
            }
@@ -140,19 +142,19 @@
        {
            // 物料优选
            MaterialSelectControl ms = new MaterialSelectControl(SwApp);
            HandlePlugin(ms, tabControl);
            HandlePlugin(ms, mainTab.tabControl);
            // 属性设置
            PropertySettingControl ps = new PropertySettingControl(SwApp);
            HandlePlugin(ps, tabControl);
            HandlePlugin(ps, mainTab.tabControl);
            // PDM
            PdmControl pdm = new PdmControl(SwApp);
            HandlePlugin(pdm, tabControl);
            HandlePlugin(pdm, mainTab.tabControl);
            // 加工件核价
            PriceCheckControl priceCheck = new PriceCheckControl(SwApp);
            HandlePlugin(priceCheck, tabControl);
            HandlePlugin(priceCheck, mainTab.tabControl);
            // 图纸审核
            DrawApproveControl drawApprove = new DrawApproveControl(SwApp);
            HandlePlugin(drawApprove, tabControl);
            HandlePlugin(drawApprove, mainTab.tabControl);
        }
        private void LoadPlugins()
@@ -176,7 +178,7 @@
                    // p.GetInstance(type.FullName);
                    // 处理插件
                    HandlePlugin(attr, obj);
                    tabControl.Items.Add(new TabItem
                    mainTab.tabControl.Items.Add(new TabItem
                    {
                        Header = attr.Title,
                        Content = obj
@@ -281,6 +283,23 @@
            AfterDocDestroy?.Invoke();
        }
        public void DeActiveHandler()
        {
            foreach (TabItem item in mainTab.tabControl.Items)
            {
                // 向主Control注册事件
                if (item.Content is IActiveDocChangeHandler handler)
                {
                    ActiveDocChangeEvent -= handler.OnSwActiveDocChange;
                    ActiveDocSavedEvent -= handler.OnSwActiveDocSaved;
                    ActiveDocCustomPropertyChange -= handler.OnCustomPropertyChange;
                    DocDestroy -= handler.OnDocDestroy;
                    AfterDocDestroy -= handler.AfterDocDestroy;
                }
            }
            PluginInfos.Clear();
        }
        /// <summary>
        /// 连接到SolidWorks之后,激活中的文档自定义属性变更的操作
        /// </summary>
PdmSwPlugin.Main/Tcp/TcpReqInfo.cs
New file
@@ -0,0 +1,34 @@
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketBase.Protocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
namespace PdmSwPlugin.Main.Tcp
{
    public class DTReceiveFilter : ReceiveFilterBase<StringRequestInfo>
    {
        public override StringRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest)
        {
            rest = 0;
            return new StringRequestInfo(DateTime.Now + "", "123", new string[] { "123" });
        }
    }
    public class TcpServer : AppServer<TcpSession>
    {
        public TcpServer() : base(new DefaultReceiveFilterFactory<DTReceiveFilter, StringRequestInfo>())
        {
        }
    }
    public class TcpSession : AppSession<TcpSession, StringRequestInfo>
    {
    }
}
PdmSwPlugin.MaterialSelect/PdmSwPlugin.MaterialSelect.csproj
@@ -71,10 +71,6 @@
      <HintPath>C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\api\redist\SolidWorks.Interop.swconst.dll</HintPath>
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </Reference>
    <Reference Include="SolidWorks.Interop.swpublished">
      <HintPath>..\..\..\..\..\Program Files\SOLIDWORKS Corp\SOLIDWORKS\api\redist\SolidWorks.Interop.swpublished.dll</HintPath>
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </Reference>
    <Reference Include="System">
      <Private>True</Private>
    </Reference>
PdmSwPlugin.PDM/PdmControl.xaml.cs
@@ -36,6 +36,9 @@
using PdmSwPlugin.Commmon.Control;
using PdmSwPlugin.Common.Entity.System;
using System.Windows.Documents;
using System.Windows.Input;
using NPOI.POIFS.Properties;
using NPOI.POIFS.Crypt;
namespace PdmSwPlugin.PDM
{
@@ -1093,6 +1096,128 @@
            return allSuccess;
        }
        public void sb(dynamic[] datas) {
            /*Dictionary<string, DrawInfo> properties = datas[0];
            string key = datas[1];
            KeyValuePair<string, DrawInfo> property = datas[2];
            List<string> temp = datas[3];
            CountdownEvent counter = datas[4];
            try
            {
                int iii, ref bool allSuccess
                Logger.Info($"{key} checking rule...");
                iii++;
                Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
                DrawInfo checkResult = result.HandleResult();
                properties[key].checkRuleResult = checkResult.checkRuleResult;
                properties[key].errMessages = checkResult.errMessages;
                var msgs = checkResult.errMessages;
                if (!properties[key].HistoryData && !checkResult.checkRuleOk)
                {
                    allSuccess = false;
                }
                if (!properties[key].HistoryData && msgs != null && msgs.Count > 0)
                {
                    lock (temp)
                    {
                        foreach (string msg in msgs)
                        {
                            temp.Add($"物料【{key}】未通过规则检查!{msg}");
                        }
                    }
                }
                MaskAdorner.ShowMessage(content, $"物料【{key}】检查完成");
            }
            catch (Exception ex)
            {
                properties[key].checkRuleResult = 2;
                properties[key].errMessages = new List<string> { "发起检查失败,请重试" };
                lock (temp)
                {
                    temp.Add($"物料【{key}】发起检查失败,请重试");
                }
                allSuccess = false;
                MaskAdorner.ShowMessage(content, $"物料【{key}】检查完成");
            }
            finally
            {
                counter.Signal();
            }*/
        }
        public bool DoCheckRuleAsync(out List<string> messages)
        {
            var temp = new List<string>();
            bool allSuccess = true;
            Dictionary<string, DrawInfo> properties = GetAllProperties(temp);
            MaskAdorner.ShowMessage(content, "正在请求数据...");
            var factory = LimitedConcurrencyLevelTaskScheduler.Factory;
            CountdownEvent counter = new CountdownEvent(properties.Count);
            int iii = 1;
            foreach (KeyValuePair<string, DrawInfo> property in properties)
            {
                string key = property.Key;
                _ = ThreadPool.QueueUserWorkItem(
                (WaitCallback)delegate
                {
                    try
                    {
                        Logger.Error($"{key} checking rule...");
                        iii++;
                        Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
                        DrawInfo checkResult = result.HandleResult();
                        properties[key].checkRuleResult = checkResult.checkRuleResult;
                        properties[key].errMessages = checkResult.errMessages;
                        var msgs = checkResult.errMessages;
                        if (!properties[key].HistoryData && !checkResult.checkRuleOk)
                        {
                            allSuccess = false;
                        }
                        if (!properties[key].HistoryData && msgs != null && msgs.Count > 0)
                        {
                            lock (temp)
                            {
                                foreach (string msg in msgs)
                                {
                                    temp.Add($"物料【{key}】未通过规则检查!{msg}");
                                }
                            }
                        }
                        MaskAdorner.ShowMessage(content, $"物料【{key}】检查完成");
                    }
                    catch (Exception ex)
                    {
                        properties[key].checkRuleResult = 2;
                        properties[key].errMessages = new List<string> { "发起检查失败,请重试" };
                        lock (temp)
                        {
                            temp.Add($"物料【{key}】发起检查失败,请重试");
                        }
                        allSuccess = false;
                        MaskAdorner.ShowMessage(content, $"物料【{key}】检查完成");
                    }
                    finally
                    {
                        counter.Signal();
                    }
                });
                /* factory.StartNew(() =>
                 {
                 });*/
            }
            counter.Wait();
            counter.Dispose();
            messages = temp;
            return allSuccess;
        }
        private void ShowExWindow(MultiExWindow exWin)
        {
            IntPtr winformWindow = Process.GetCurrentProcess().MainWindowHandle;
@@ -1688,6 +1813,10 @@
                    {
                        // 执行规则检查并获取结果
                        RefreshBomList(SwApp.IActiveDoc2);
                        if (model.bomTreeReader.CacheList.Count <= 0)
                        {
                            throw new CantCheckInException(new List<string> { "请打开一张图纸" });
                        }
                        DoCheckRule(out _);
                        // 筛选所有在物料明细表中,不跳过检查并且检查未通过的,类型是加工件的未通过审核的,加工件审核通过的但图纸变更的
                        List<string> errs = model.bomTreeReader.CacheList.Select(b => b.NeedStopCheckIn())
PdmSwPlugin.PDM/PdmSwPlugin.PDM.csproj
@@ -104,10 +104,6 @@
    <Reference Include="SixLabors.ImageSharp, Version=2.0.0.0, Culture=neutral, PublicKeyToken=d998eea7b14cab13, processorArchitecture=MSIL">
      <HintPath>..\PdmSw\packages\SixLabors.ImageSharp.2.1.3\lib\net472\SixLabors.ImageSharp.dll</HintPath>
    </Reference>
    <Reference Include="SolidWorks.Interop.gtswutilities">
      <HintPath>..\..\..\..\..\Program Files\SOLIDWORKS Corp\SOLIDWORKS\api\redist\SolidWorks.Interop.gtswutilities.dll</HintPath>
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </Reference>
    <Reference Include="SolidWorks.Interop.sldworks">
      <HintPath>C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\api\redist\SolidWorks.Interop.sldworks.dll</HintPath>
      <EmbedInteropTypes>True</EmbedInteropTypes>
PdmSwPlugin.PropertySetting/CommonSettingControl.xaml
@@ -3,7 +3,6 @@
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             Initialized="PropertySettingControl_Initialized"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs
@@ -232,7 +232,7 @@
            this.SwApp = SwApp;
        }
        private void InitPropertyData()
        public void InitPropertyData()
        {
            if (Client == null)
            {
@@ -461,6 +461,22 @@
            else if (docType == (int)swDocumentTypes_e.swDocASSEMBLY)
            {
                ReadDocPath = ReadDoc.GetPathName();
                if (ReadDoc.IsOpenedViewOnly())
                {
                    contentKey = "default";
                    control = controlCache[contentKey];
                    newOne = control as IPropertyOpt;
                    newOne.SetProperties(null, "当前处于只读模式", true, out _);
                }
                else if (ReadDoc.IsOpenedReadOnly())
                {
                    contentKey = "default";
                    control = controlCache[contentKey];
                    newOne = control as IPropertyOpt;
                    newOne.SetProperties(null, "当前处于只读模式", true, out _);
                }
                else
                {
                // !Equals(LastReadDoc, ReadDoc)
                properties = CustomPropertyUtil.GetCustomProperties2(ReadDoc, true, skipName);
                string fileType = properties.Get(NameConstant.docType);
@@ -480,6 +496,7 @@
                newOne = control as IPropertyOpt;
                newOne.SetProperties(ReadDoc, properties, true, out _);
            }
            }
            else
            {
                contentKey = "default";
PluginLisener/.vs/PluginLisener.csproj.dtbcache.json
New file
@@ -0,0 +1 @@
{"RootPath":"D:\\Workspace\\PdmSwPlugin2\\PluginLisener","ProjectFileName":"PluginLisener.csproj","Configuration":"Debug|x64","FrameworkPath":"","Sources":[{"SourceFile":"PluginLisener.cs"},{"SourceFile":"PluginLisener.Designer.cs"},{"SourceFile":"Program.cs"},{"SourceFile":"ProjectInstaller.cs"},{"SourceFile":"ProjectInstaller.Designer.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"obj\\x64\\Debug\\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs"}],"References":[{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\packages\\HtmlToXamlConverter.1.0.5727.24510\\lib\\net45\\HtmlToXamlConverter.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Configuration.Install.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Management.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.ServiceProcess.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\bin\\x64\\Debug\\PluginLisener.exe","OutputItemRelativePath":"PluginLisener.exe"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}
PluginLisener/.vs/PluginLisener/v17/DocumentLayout.backup.json
New file
@@ -0,0 +1,53 @@
{
  "Version": 1,
  "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{08B29115-BDDE-43E6-9E6B-EB6DC75B35D9}|PluginLisener.csproj|d:\\workspace\\pdmswplugin2\\pluginlisener\\pluginlisener.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{08B29115-BDDE-43E6-9E6B-EB6DC75B35D9}|PluginLisener.csproj|solutionrelative:pluginlisener.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{08B29115-BDDE-43E6-9E6B-EB6DC75B35D9}|PluginLisener.csproj|D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{08B29115-BDDE-43E6-9E6B-EB6DC75B35D9}|PluginLisener.csproj|solutionrelative:program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
    {
      "Orientation": 0,
      "VerticalTabListWidth": 256,
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 0,
          "Children": [
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "PluginLisener.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\PluginLisener.cs",
              "RelativeDocumentMoniker": "PluginLisener.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\PluginLisener.cs",
              "RelativeToolTip": "PluginLisener.cs",
              "ViewState": "AgIAAAYAAAAAAAAAAAAAAA8AAABBAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-08-23T08:16:41.952Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "Program.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\Program.cs",
              "RelativeDocumentMoniker": "Program.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\Program.cs",
              "RelativeToolTip": "Program.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAABMAAAAhAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-08-23T08:16:20.579Z"
            }
          ]
        }
      ]
    }
  ]
}
PluginLisener/.vs/PluginLisener/v17/DocumentLayout.json
New file
@@ -0,0 +1,71 @@
{
  "Version": 1,
  "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{08B29115-BDDE-43E6-9E6B-EB6DC75B35D9}|PluginLisener.csproj|d:\\workspace\\pdmswplugin2\\pluginlisener\\pluginlisener.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{08B29115-BDDE-43E6-9E6B-EB6DC75B35D9}|PluginLisener.csproj|solutionrelative:pluginlisener.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{08B29115-BDDE-43E6-9E6B-EB6DC75B35D9}|PluginLisener.csproj|d:\\workspace\\pdmswplugin2\\pluginlisener\\pluginlisener.designer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{08B29115-BDDE-43E6-9E6B-EB6DC75B35D9}|PluginLisener.csproj|solutionrelative:pluginlisener.designer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{08B29115-BDDE-43E6-9E6B-EB6DC75B35D9}|PluginLisener.csproj|D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{08B29115-BDDE-43E6-9E6B-EB6DC75B35D9}|PluginLisener.csproj|solutionrelative:program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
    {
      "Orientation": 0,
      "VerticalTabListWidth": 256,
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 1,
          "Children": [
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "PluginLisener.Designer.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\PluginLisener.Designer.cs",
              "RelativeDocumentMoniker": "PluginLisener.Designer.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\PluginLisener.Designer.cs",
              "RelativeToolTip": "PluginLisener.Designer.cs",
              "ViewState": "AgIAABMAAAAAAAAAAAAgwB4AAAArAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-09-12T08:38:16.635Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "PluginLisener.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\PluginLisener.cs",
              "RelativeDocumentMoniker": "PluginLisener.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\PluginLisener.cs",
              "RelativeToolTip": "PluginLisener.cs",
              "ViewState": "AgIAABgAAAAAAAAAAAAowBEAAAAIAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-08-23T08:16:41.952Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "Program.cs",
              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\Program.cs",
              "RelativeDocumentMoniker": "Program.cs",
              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PluginLisener\\Program.cs",
              "RelativeToolTip": "Program.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAAdAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2024-08-23T08:16:20.579Z",
              "EditorCaption": ""
            }
          ]
        }
      ]
    }
  ]
}
PluginLisener/App.config
New file
@@ -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>
PluginLisener/PluginLisener.Designer.cs
New file
@@ -0,0 +1,38 @@
namespace PluginLisener
{
    partial class PluginLisener
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
        #region 组件设计器生成的代码
        /// <summary>
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
            this.ServiceName = "PdmSwPluginLisener";
            this.CanStop = true;
        }
        #endregion
    }
}
PluginLisener/PluginLisener.cs
New file
@@ -0,0 +1,56 @@
using System.Runtime.InteropServices;
using System;
using System.ServiceProcess;
using System.Collections.Generic;
using SolidWorks.Interop.sldworks;
namespace PluginLisener
{
    public partial class PluginLisener : ServiceBase
    {
        public PluginLisener()
        {
            InitializeComponent();
        }
        private List<SldWorks> processIds = new List<SldWorks>();
        public static IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;
        protected override void OnStart(string[] args)
        {
            var SwApp = (SldWorks)Marshal.GetActiveObject("SldWorks.Application");
            int resp = 0;
            WTSSendMessage(
              WTS_CURRENT_SERVER_HANDLE,
              WTSGetActiveConsoleSessionId(),//获得当前显示的桌面所在的SessionID
                      "title", "title".Length,
              "message", "message".Length,
              0, 0, out resp, false);
        }
        public void StartScan() {
        }
        protected override void OnStop()
        {
        }
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern int WTSGetActiveConsoleSessionId();
        [DllImport("wtsapi32.dll", SetLastError = true)]
        public static extern bool WTSSendMessage( //一个Session中的进程可以用WTSSendMessage,让另一个Session弹出对话框
            IntPtr hServer,
      int SessionId,
      String pTitle,
      int TitleLength,
      String pMessage,
      int MessageLength,
      int Style,
      int Timeout,
      out int pResponse,
      bool bWait);
    }
}
PluginLisener/PluginLisener.csproj
New file
@@ -0,0 +1,107 @@
<?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>{08B29115-BDDE-43E6-9E6B-EB6DC75B35D9}</ProjectGuid>
    <OutputType>WinExe</OutputType>
    <RootNamespace>PluginLisener</RootNamespace>
    <AssemblyName>PluginLisener</AssemblyName>
    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <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>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\x64\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <DebugType>full</DebugType>
    <PlatformTarget>x64</PlatformTarget>
    <LangVersion>7.3</LangVersion>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
    <OutputPath>bin\x64\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <Optimize>true</Optimize>
    <DebugType>pdbonly</DebugType>
    <PlatformTarget>x64</PlatformTarget>
    <LangVersion>7.3</LangVersion>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="HtmlToXamlConverter, Version=1.0.5727.24510, Culture=neutral, processorArchitecture=MSIL">
      <HintPath>packages\HtmlToXamlConverter.1.0.5727.24510\lib\net45\HtmlToXamlConverter.dll</HintPath>
    </Reference>
    <Reference Include="SolidWorks.Interop.sldworks">
      <HintPath>C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\api\redist\SolidWorks.Interop.sldworks.dll</HintPath>
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Configuration.Install" />
    <Reference Include="System.Core" />
    <Reference Include="System.Management" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.ServiceProcess" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="PluginLisener.cs">
      <SubType>Component</SubType>
    </Compile>
    <Compile Include="PluginLisener.Designer.cs">
      <DependentUpon>PluginLisener.cs</DependentUpon>
    </Compile>
    <Compile Include="Program.cs" />
    <Compile Include="ProjectInstaller.cs">
      <SubType>Component</SubType>
    </Compile>
    <Compile Include="ProjectInstaller.Designer.cs">
      <DependentUpon>ProjectInstaller.cs</DependentUpon>
    </Compile>
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <None Include="App.config" />
    <None Include="packages.config" />
  </ItemGroup>
  <ItemGroup>
    <EmbeddedResource Include="ProjectInstaller.resx">
      <DependentUpon>ProjectInstaller.cs</DependentUpon>
    </EmbeddedResource>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <PropertyGroup>
    <PostBuildEvent>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe "$(TargetFileName)" &amp; net start PdmSwPluginLisener</PostBuildEvent>
  </PropertyGroup>
  <PropertyGroup>
    <PreBuildEvent>sc delete PdmSwPluginLisener</PreBuildEvent>
  </PropertyGroup>
</Project>
PluginLisener/Program.cs
New file
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
namespace PluginLisener
{
    internal static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                new PluginLisener()
            };
            ServiceBase.Run(ServicesToRun);
        }
    }
}
PluginLisener/ProjectInstaller.Designer.cs
New file
@@ -0,0 +1,56 @@
namespace PluginLisener
{
    partial class ProjectInstaller
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
        #region 组件设计器生成的代码
        /// <summary>
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
            this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
            //
            // serviceProcessInstaller1
            //
            this.serviceProcessInstaller1.Password = null;
            this.serviceProcessInstaller1.Username = null;
            //
            // serviceInstaller1
            //
            this.serviceInstaller1.ServiceName = "PdmSwPluginLisener";
            //
            // ProjectInstaller
            //
            this.Installers.AddRange(new System.Configuration.Install.Installer[] {
            this.serviceProcessInstaller1,
            this.serviceInstaller1});
        }
        #endregion
        private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;
        private System.ServiceProcess.ServiceInstaller serviceInstaller1;
    }
}
PluginLisener/ProjectInstaller.cs
New file
@@ -0,0 +1,19 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.Threading.Tasks;
namespace PluginLisener
{
    [RunInstaller(true)]
    public partial class ProjectInstaller : System.Configuration.Install.Installer
    {
        public ProjectInstaller()
        {
            InitializeComponent();
        }
    }
}
PluginLisener/ProjectInstaller.resx
New file
@@ -0,0 +1,129 @@
<?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>
  <metadata name="serviceProcessInstaller1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
    <value>17, 17</value>
  </metadata>
  <metadata name="serviceInstaller1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
    <value>210, 17</value>
  </metadata>
  <metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>False</value>
  </metadata>
</root>
PluginLisener/Properties/AssemblyInfo.cs
New file
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("PluginLisener")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PluginLisener")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("08b29115-bdde-43e6-9e6b-eb6dc75b35d9")]
// 程序集的版本信息由下列四个值组成:
//
//      主版本
//      次版本
//      生成号
//      修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
PluginLisener/packages.config
New file
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="HtmlToXamlConverter" version="1.0.5727.24510" targetFramework="net472" />
</packages>
PluginListener/.vs/PluginListener/v17/DocumentLayout.json
New file
@@ -0,0 +1,12 @@
{
  "Version": 1,
  "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\PluginListener\\",
  "Documents": [],
  "DocumentGroupContainers": [
    {
      "Orientation": 0,
      "VerticalTabListWidth": 256,
      "DocumentGroups": []
    }
  ]
}
PluginListener/Alert.xaml
New file
@@ -0,0 +1,15 @@
<Window x:Class="PluginListener.Alert"
        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:Test1"
        mc:Ignorable="d"
        ShowInTaskbar="False"
        Topmost="True" Height="Auto" Width="Auto"
        Title="提示">
    <StackPanel HorizontalAlignment="Center">
        <Label x:Name="label"/>
        <Button Click="Button_Click">确认</Button>
    </StackPanel>
</Window>
PluginListener/Alert.xaml.cs
New file
@@ -0,0 +1,49 @@
using System.Windows;
namespace PluginListener
{
    /// <summary>
    /// Alert.xaml 的交互逻辑
    /// </summary>
    public partial class Alert : Window
    {
        public Alert()
        {
            InitializeComponent();
        }
        public void Open(string msg)
        {
            Dispatcher.Invoke(() =>
            {
                label.Content = msg;
                this.Show();
            });
        }
        public void DoHide()
        {
            Dispatcher.Invoke(() =>
            {
                this.Hide();
            });
        }
        public void DoClose()
        {
            Dispatcher.Invoke(() =>
            {
                this.Close();
            });
        }
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            e.Cancel = true;
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.Hide();
        }
    }
}
PluginListener/App.config
New file
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
  </startup>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source = |SQL/CE|" />
  </connectionStrings>
</configuration>
PluginListener/Intercepter.cs
New file
@@ -0,0 +1,47 @@
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace Test1
{
    public class Intercepter
    {
        private Task importListenTask;
        private Task checkInListenTask;
        private CancellationTokenSource cts;
        public Intercepter(Action callback1, Action callback2)
        {
            cts = new CancellationTokenSource();
            /// 启动导入拦截
            importListenTask = Task.Run(() =>
            {
                while (!cts.IsCancellationRequested)
                {
                    Debug.WriteLine("inter Import");
                    // 监听导入插件的启动
                    callback1();
                    Thread.Sleep(30);
                }
            });
            /// 启动检入拦截
            checkInListenTask = Task.Run(() =>
            {
                while (!cts.IsCancellationRequested)
                {
                    Debug.WriteLine("inter CheckIn");
                    // 监听检入插件的启动
                    callback2();
                    Thread.Sleep(30);
                }
            });
        }
        public void StopIntercept()
        {
            cts.Cancel();
        }
    }
}
PluginListener/Listener.cs
New file
@@ -0,0 +1,392 @@
using log4net;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using SuperSocket.ClientEngine;
using System;
using System.Diagnostics;
using System.Net;
using System.Runtime.InteropServices;
using System.ServiceProcess;
using System.Text;
using System.Timers;
using System.Windows;
using Test1;
namespace PluginListener
{
    public class Listener : ServiceBase
    {
        ILog log = LogManager.GetLogger("Listener");
        private AsyncTcpSession client;
        private long err_count;
        private System.Timers.Timer socketTimer;
        private System.Timers.Timer importTimer;
        private System.Timers.Timer checkInTimer;
        private Alert alert;
        private volatile int is_open = int.MaxValue;
        private int msgInterval = 5000;
        #region 消息
        public static IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;
        public void ShowMessageBox(string message, string title)
        {
            /*if (is_open == 0)
            {
                return;
            }*/
            is_open = 0;
            int res;
            WTSSendMessage(
                WTS_CURRENT_SERVER_HANDLE,
                WTSGetActiveConsoleSessionId(),
                title, title.Length,
                message, message.Length,
                0, 0, out res, true);
            is_open = res;
        }
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern int WTSGetActiveConsoleSessionId();
        [DllImport("wtsapi32.dll", SetLastError = true)]
        public static extern bool WTSSendMessage(
            IntPtr hServer,
            int SessionId,
            String pTitle,
            int TitleLength,
            String pMessage,
            int MessageLength,
            int Style,
            int Timeout,
            out int pResponse,
            bool bWait);
        #endregion
        #region 组件设计器生成的代码
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
        /// <summary>
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
            this.ServiceName = "PdmSwPluginLisener";
            this.CanStop = true;
        }
        #endregion
        private void AlertMsg(string msg)
        {
            /// 内置WPF的 不能用
            // alert.Open(msg);
            /*try
            {
                // SwApp = (SldWorks)Marshal.GetActiveObject("SldWorks.Application.28");
                var swApp = (SldWorks)System.Runtime.InteropServices.Marshal.GetActiveObject("SldWorks.Application");
                swApp.SendMsgToUser2(msg, (int)swMessageBoxIcon_e.swMbStop, (int)swMessageBoxBtn_e.swMbOk);
                Marshal.ReleaseComObject(swApp);
            }
            catch (COMException ex)
            {
                log.Error("Attach Sw Failed.", ex);
            }*/
            WinAPI_Interop.ShowServiceMessage(msg, "提示");
            // ShowMessageBox(msg, "提示");
            /// 用MessageBox的 不能用
            /*if (swApp == null)
            {
                int res;
                WTSSendMessage(
                  WTS_CURRENT_SERVER_HANDLE,
                  WTSGetActiveConsoleSessionId(),//获得当前显示的桌面所在的SessionID
                          "提示", "提示".Length,
                  msg, msg.Length,
                  0, 0, out res, false);
            }
            else
            {
                swApp.SendMsgToUser2(msg, (int)swMessageBoxIcon_e.swMbStop, (int)swMessageBoxBtn_e.swMbOk);
            }*/
            //
            ///启动exe的
            /*ProcessStartInfo psi = new ProcessStartInfo
            {
                FileName = "AlertWindow.exe",
                UseShellExecute = false,
                CreateNoWindow = true
            };
            Process process = Process.Start(psi);*/
        }
        public Listener()
        {
            alert = new Alert();
            client = new AsyncTcpSession();
            client.Connected += Client_Connected;
            client.Error += Client_Error;
            client.Closed += Client_Closed;
            client.DataReceived += Client_DataReceived;
            InitializeComponent();
            log.Info("Service Started.");
        }
        protected override void OnStart(string[] args)
        {
            Start();
        }
        protected override void OnStop()
        {
            Stop();
        }
        public void Start()
        {
            InitSocketTimer();
        }
        public void Stop()
        {
            socketTimer?.Stop();
            StopInterceptTimer();
            // alert.DoClose();
            // if (intercepter != null) intercepter.StopIntercept();
        }
        /// <summary>
        /// 启动Socket定时器
        /// </summary>
        public void InitSocketTimer()
        {
            log.Info("Starting Socket Timer...");
            socketTimer = new System.Timers.Timer(msgInterval);
            socketTimer.Elapsed += Timer_Elapsed;
            socketTimer.Enabled = true;
            socketTimer.Start();
            log.Info("Started Socket Timer!");
        }
        /// <summary>
        /// 启动金蝶拦截任务
        /// </summary>
        public void StartInterceptTimer()
        {
            // if (intercepter == null) intercepter = new Intercepter(ListenImportHandle, ListenCheckInHandle);
            if (importTimer == null)
            {
                importTimer = new System.Timers.Timer(500);
                importTimer.Elapsed += ImportTimer_Elapsed;
            }
            importTimer.Start();
            if (checkInTimer == null)
            {
                checkInTimer = new System.Timers.Timer(500);
                checkInTimer.Elapsed += CheckInTimer_Elapsed;
            }
            checkInTimer.Start();
        }
        private void ImportTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (importTimer)
            {
                ListenImportHandle();
            }
        }
        private void CheckInTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (checkInTimer)
            {
                ListenCheckInHandle();
            }
        }
        /// <summary>
        /// 停止金蝶拦截任务
        /// </summary>
        private void StopInterceptTimer()
        {
            /*if (intercepter != null)
            {
                intercepter.StopIntercept();
                intercepter = null;
            }*/
            importTimer?.Stop();
            checkInTimer?.Stop();
        }
        /// <summary>
        /// 插件返回正常时的处理
        /// </summary>
        private void HandleNormal()
        {
            err_count = 0;
            StopInterceptTimer();
            // alert.DoHide();
        }
        private bool IsSwRunning()
        {
            Process[] ps = Process.GetProcessesByName("SLDWORKS");
            bool IsRunning = (ps != null && ps.Length > 0);
            log.Debug($"Sw Is Running: {IsRunning}");
            return IsRunning;
        }
        /// <summary>
        /// 插件返回异常时的处理
        /// </summary>
        private void HandleErr()
        {
            log.Debug($"err_count: {err_count}");
            if (++err_count > 3)
            {
                if (IsSwRunning())
                {
                    // 如果solidworks启动
                    StartInterceptTimer();
                    log.Debug("Ready to show Msg.");
                    AlertMsg("请启用插件并登录");
                    err_count = 3;
                }
                else
                {
                    HandleNormal();
                }
            }
        }
        /// <summary>
        /// 搜索是否有导入窗口,有就一直最小化,并执行规则检查
        /// </summary>
        /// <returns></returns>
        private void ListenImportHandle()
        {
            IntPtr ptr = WindowIntPtrUtil.FindWindow(null, "Everything");//导入文档
            if (ptr == IntPtr.Zero)
            {
                return;
            }
            WindowIntPtrUtil.KillProcessByIntPtr(ptr);
        }
        /// <summary>
        /// 搜索是否有检入窗口,有就一直最小化,并执行规则检查
        /// </summary>
        /// <returns></returns>
        private void ListenCheckInHandle()
        {
            IntPtr ptr = WindowIntPtrUtil.FindWindow(null, "检入文档");
            if (ptr == IntPtr.Zero)
            {
                return;
            }
            WindowIntPtrUtil.KillProcessByIntPtr(ptr);
        }
        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            socketTimer.Stop();
            try
            {
                if (!client.IsConnected)
                {
                    client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5678));
                }
                else
                {
                    var msg = Encoding.Default.GetBytes("HeatBeat");
                    client.Send(msg, 0, msg.Length);
                }
            }
            catch (Exception ex)
            {
                HandleErr();
            }
            finally
            {
                socketTimer.Start();
            }
        }
        /// <summary>
        /// 接收到消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Client_DataReceived(object sender, DataEventArgs e)
        {
            byte flag = e.Data[0];
            if (flag == 1)
            {
                HandleNormal();
            }
            else
            {
                log.Error("Plugin Return 0.");
                HandleErr();
            }
        }
        /// <summary>
        /// 客户端关闭,视为异常
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Client_Closed(object sender, EventArgs e)
        {
            HandleErr();
        }
        /// <summary>
        /// 客户端异常
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Client_Error(object sender, ErrorEventArgs e)
        {
            HandleErr();
        }
        /// <summary>
        /// 连接后的操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Client_Connected(object sender, EventArgs e)
        {
        }
    }
}
PluginListener/PluginListener.csproj
New file
@@ -0,0 +1,245 @@
<?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>{E92EE4C3-A373-41FE-8234-2DB56E2C6DFA}</ProjectGuid>
    <OutputType>WinExe</OutputType>
    <RootNamespace>PluginListener</RootNamespace>
    <AssemblyName>PluginListener</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>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>..\PdmSw\bin\x64\Debug\Listener\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <DebugType>full</DebugType>
    <PlatformTarget>x64</PlatformTarget>
    <LangVersion>7.3</LangVersion>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
    <OutputPath>..\PdmSw\bin\x64\Release\Listener\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <Optimize>true</Optimize>
    <DebugType>pdbonly</DebugType>
    <PlatformTarget>x64</PlatformTarget>
    <LangVersion>7.3</LangVersion>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup>
    <TargetZone>LocalIntranet</TargetZone>
  </PropertyGroup>
  <PropertyGroup>
    <GenerateManifests>false</GenerateManifests>
  </PropertyGroup>
  <PropertyGroup>
    <ApplicationManifest>Properties\app.manifest</ApplicationManifest>
  </PropertyGroup>
  <PropertyGroup>
    <StartupObject>PluginListener.Program</StartupObject>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="log4net, Version=1.2.13.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
      <HintPath>packages\log4net.2.0.3\lib\net40-full\log4net.dll</HintPath>
    </Reference>
    <Reference Include="SolidWorks.Interop.sldworks">
      <HintPath>C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\api\redist\SolidWorks.Interop.sldworks.dll</HintPath>
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </Reference>
    <Reference Include="SolidWorks.Interop.swconst">
      <HintPath>C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\api\redist\SolidWorks.Interop.swconst.dll</HintPath>
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </Reference>
    <Reference Include="SuperSocket.ClientEngine, Version=0.10.0.0, Culture=neutral, PublicKeyToken=ee9af13f57f00acc, processorArchitecture=MSIL">
      <HintPath>packages\SuperSocket.ClientEngine.0.10.0\lib\net45\SuperSocket.ClientEngine.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.Common, Version=1.6.6.1, Culture=neutral, PublicKeyToken=6c80000676988ebb, processorArchitecture=MSIL">
      <HintPath>packages\SuperSocket.1.6.6.1\lib\net45\SuperSocket.Common.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.Facility, Version=1.6.6.1, Culture=neutral, PublicKeyToken=6c80000676988ebb, processorArchitecture=MSIL">
      <HintPath>packages\SuperSocket.1.6.6.1\lib\net45\SuperSocket.Facility.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.ProtoBase, Version=1.7.0.17, Culture=neutral, PublicKeyToken=6c80000676988ebb, processorArchitecture=MSIL">
      <HintPath>packages\SuperSocket.ProtoBase.1.7.0.17\lib\net45\SuperSocket.ProtoBase.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.SocketBase, Version=1.6.6.1, Culture=neutral, PublicKeyToken=6c80000676988ebb, processorArchitecture=MSIL">
      <HintPath>packages\SuperSocket.1.6.6.1\lib\net45\SuperSocket.SocketBase.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.SocketEngine, Version=1.6.6.1, Culture=neutral, PublicKeyToken=6c80000676988ebb, processorArchitecture=MSIL">
      <HintPath>packages\SuperSocket.Engine.1.6.6.1\lib\net45\SuperSocket.SocketEngine.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.SocketService, Version=1.6.6.1, Culture=neutral, PublicKeyToken=6c80000676988ebb, processorArchitecture=MSIL">
      <HintPath>packages\SuperSocket.Engine.1.6.6.1\lib\net45\SuperSocket.SocketService.exe</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Collections.Specialized, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Collections.Specialized.4.3.0\lib\net46\System.Collections.Specialized.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.ComponentModel.Composition" />
    <Reference Include="System.Configuration" />
    <Reference Include="System.Configuration.Install" />
    <Reference Include="System.Data" />
    <Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Linq, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Linq.4.3.0\lib\net463\System.Linq.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Management" />
    <Reference Include="System.Net.NameResolution, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Net.NameResolution.4.3.0\lib\net46\System.Net.NameResolution.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Net.Security, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Net.Security.4.3.0\lib\net46\System.Net.Security.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Runtime.Extensions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Runtime.InteropServices, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.ServiceProcess" />
    <Reference Include="System.Web.Extensions" />
    <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>
    <Compile Include="Alert.xaml.cs">
      <DependentUpon>Alert.xaml</DependentUpon>
    </Compile>
    <Compile Include="Listener.cs">
      <SubType>Component</SubType>
    </Compile>
    <Compile Include="Intercepter.cs" />
    <Compile Include="Program.cs" />
    <Compile Include="Util.cs" />
    <Compile Include="WindowUtil.cs" />
  </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="log4net.config">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Include="packages.config" />
    <None Include="Properties\app.manifest" />
    <None Include="Properties\Settings.settings">
      <Generator>SettingsSingleFileGenerator</Generator>
      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
    </None>
    <None Include="supersocket.cmd" />
    <None Include="supersocket.sh" />
  </ItemGroup>
  <ItemGroup>
    <None Include="App.config" />
  </ItemGroup>
  <ItemGroup>
    <Page Include="Alert.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <PropertyGroup>
    <PostBuildEvent>
    </PostBuildEvent>
  </PropertyGroup>
</Project>
PluginListener/Program.cs
New file
@@ -0,0 +1,32 @@
using log4net.Config;
using System;
using System.IO;
using System.Reflection;
using System.ServiceProcess;
namespace PluginListener
{
    public class Program
    { /// <summary>
      /// 应用程序的主入口点。
      /// </summary>
        [STAThread]
        public static void Main()
        {
            string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
            string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
            string configFilePath = Path.Combine(assemblyDirPath,"log4net.config");
            XmlConfigurator.Configure(new FileInfo(configFilePath));
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                new Listener()
            };
            ServiceBase.Run(ServicesToRun);
        }
    }
}
// sc create "SolidWorks Listener" binpath= "D:\Workspace\PdmSwPlugin2\PdmSw\bin\x64\Debug\Listener\PluginListener.exe" type= interact type= own displayname= "SolidWorks Listener"
PluginListener/Properties/AssemblyInfo.cs
New file
@@ -0,0 +1,52 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("PluginListener")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PluginListener")]
[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.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
PluginListener/Properties/Resources.Designer.cs
New file
@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
//     此代码由工具生成。
//     运行时版本:4.0.30319.42000
//
//     对此文件的更改可能会导致不正确的行为,并且如果
//     重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace PluginListener.Properties {
    using System;
    /// <summary>
    ///   一个强类型的资源类,用于查找本地化的字符串等。
    /// </summary>
    // 此类是由 StronglyTypedResourceBuilder
    // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
    // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
    // (以 /str 作为命令选项),或重新生成 VS 项目。
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.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 (object.ReferenceEquals(resourceMan, null)) {
                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PluginListener.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;
            }
        }
    }
}
PluginListener/Properties/Resources.resx
New file
@@ -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>
PluginListener/Properties/Settings.Designer.cs
New file
@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
//     此代码由工具生成。
//     运行时版本:4.0.30319.42000
//
//     对此文件的更改可能会导致不正确的行为,并且如果
//     重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace PluginListener.Properties {
    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.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;
            }
        }
    }
}
PluginListener/Properties/Settings.settings
New file
@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
  <Profiles>
    <Profile Name="(Default)" />
  </Profiles>
  <Settings />
</SettingsFile>
PluginListener/Properties/app.manifest
New file
@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <!-- UAC 清单选项
             如果想要更改 Windows 用户帐户控制级别,请使用
             以下节点之一替换 requestedExecutionLevel 节点。
        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
            指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化。
            如果你的应用程序需要此虚拟化来实现向后兼容性,则移除此
            元素。
        -->
                <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
            </requestedPrivileges>
            <applicationRequestMinimum>
                <defaultAssemblyRequest permissionSetReference="Custom" />
                <PermissionSet class="System.Security.PermissionSet" version="1" ID="Custom" SameSite="site" Unrestricted="true" />
            </applicationRequestMinimum>
        </security>
    </trustInfo>
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
            <!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的
           Windows 版本的列表。取消评论适当的元素,
           Windows 将自动选择最兼容的环境。 -->
            <!-- Windows Vista -->
            <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
            <!-- Windows 7 -->
            <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
            <!-- Windows 8 -->
            <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
            <!-- Windows 8.1 -->
            <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
            <!-- Windows 10 -->
            <!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
        </application>
    </compatibility>
    <!-- 指示该应用程序可感知 DPI 且 Windows 在 DPI 较高时将不会对其进行
       自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需
       选择加入。选择加入此设置的 Windows 窗体应用程序(面向 .NET Framework 4.6)还应
       在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。
       将应用程序设为感知长路径。请参阅 https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->
    <!--
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
      <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
    </windowsSettings>
  </application>
  -->
    <!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) -->
    <!--
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="Microsoft.Windows.Common-Controls"
          version="6.0.0.0"
          processorArchitecture="*"
          publicKeyToken="6595b64144ccf1df"
          language="*"
        />
    </dependentAssembly>
  </dependency>
  -->
</assembly>
PluginListener/Util.cs
New file
@@ -0,0 +1,184 @@
using System;
using System.Runtime.InteropServices;
namespace PluginListener
{
    public class WinAPI_Interop
    {
        public static IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;
        /// <summary>
        /// 服务程序执行消息提示,前台MessageBox.Show
        /// </summary>
        /// <param name="message">消息内容</param>
        /// <param name="title">标题</param>
        public static void ShowServiceMessage(string message, string title)
        {
            int resp = 0;
            WTSSendMessage(WTS_CURRENT_SERVER_HANDLE, WTSGetActiveConsoleSessionId(), title, title.Length, message, message.Length, 0, 0, out resp, false);
        }
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern int WTSGetActiveConsoleSessionId();
        [DllImport("wtsapi32.dll", SetLastError = true)]
        public static extern bool WTSSendMessage(IntPtr hServer, int SessionId, String pTitle, int TitleLength, String pMessage, int MessageLength, int Style, int Timeout, out int pResponse, bool bWait);
        #region P/Invoke WTS APIs
        private enum WTS_CONNECTSTATE_CLASS
        {
            WTSActive,
            WTSConnected,
            WTSConnectQuery,
            WTSShadow,
            WTSDisconnected,
            WTSIdle,
            WTSListen,
            WTSReset,
            WTSDown,
            WTSInit
        }
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        private struct WTS_SESSION_INFO
        {
            public UInt32 SessionID;
            public string pWinStationName;
            public WTS_CONNECTSTATE_CLASS State;
        }
        [DllImport("WTSAPI32.DLL", SetLastError = true, CharSet = CharSet.Auto)]
        static extern bool WTSEnumerateSessions(
            IntPtr hServer,
            [MarshalAs(UnmanagedType.U4)] UInt32 Reserved,
            [MarshalAs(UnmanagedType.U4)] UInt32 Version,
            ref IntPtr ppSessionInfo,
            [MarshalAs(UnmanagedType.U4)] ref UInt32 pSessionInfoCount
            );
        [DllImport("WTSAPI32.DLL", SetLastError = true, CharSet = CharSet.Auto)]
        static extern void WTSFreeMemory(IntPtr pMemory);
        [DllImport("WTSAPI32.DLL", SetLastError = true, CharSet = CharSet.Auto)]
        static extern bool WTSQueryUserToken(UInt32 sessionId, out IntPtr Token);
        #endregion
        #region P/Invoke CreateProcessAsUser
        /// <summary>
        /// Struct, Enum and P/Invoke Declarations for CreateProcessAsUser.
        /// </summary>
        ///
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        struct STARTUPINFO
        {
            public Int32 cb;
            public string lpReserved;
            public string lpDesktop;
            public string lpTitle;
            public Int32 dwX;
            public Int32 dwY;
            public Int32 dwXSize;
            public Int32 dwYSize;
            public Int32 dwXCountChars;
            public Int32 dwYCountChars;
            public Int32 dwFillAttribute;
            public Int32 dwFlags;
            public Int16 wShowWindow;
            public Int16 cbReserved2;
            public IntPtr lpReserved2;
            public IntPtr hStdInput;
            public IntPtr hStdOutput;
            public IntPtr hStdError;
        }
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        struct PROCESS_INFORMATION
        {
            public IntPtr hProcess;
            public IntPtr hThread;
            public int dwProcessId;
            public int dwThreadId;
        }
        /// <summary>
        /// 以当前登录的windows用户(角色权限)运行指定程序进程
        /// </summary>
        /// <param name="hToken"></param>
        /// <param name="lpApplicationName">指定程序(全路径)</param>
        /// <param name="lpCommandLine">参数</param>
        /// <param name="lpProcessAttributes">进程属性</param>
        /// <param name="lpThreadAttributes">线程属性</param>
        /// <param name="bInheritHandles"></param>
        /// <param name="dwCreationFlags"></param>
        /// <param name="lpEnvironment"></param>
        /// <param name="lpCurrentDirectory"></param>
        /// <param name="lpStartupInfo">程序启动属性</param>
        /// <param name="lpProcessInformation">最后返回的进程信息</param>
        /// <returns>是否调用成功</returns>
        [DllImport("ADVAPI32.DLL", SetLastError = true, CharSet = CharSet.Auto)]
        static extern bool CreateProcessAsUser(IntPtr hToken, string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes,
                                                      bool bInheritHandles, uint dwCreationFlags, string lpEnvironment, string lpCurrentDirectory,
                                                      ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation);
        [DllImport("KERNEL32.DLL", SetLastError = true, CharSet = CharSet.Auto)]
        static extern bool CloseHandle(IntPtr hHandle);
        #endregion
        /// <summary>
        /// 以当前登录系统的用户角色权限启动指定的进程
        /// </summary>
        /// <param name="ChildProcName">指定的进程(全路径)</param>
        public static void CreateProcess(string ChildProcName)
        {
            IntPtr ppSessionInfo = IntPtr.Zero;
            UInt32 SessionCount = 0;
            if (WTSEnumerateSessions(
                                    (IntPtr)WTS_CURRENT_SERVER_HANDLE,  // Current RD Session Host Server handle would be zero.
                                    0,  // This reserved parameter must be zero.
                                    1,  // The version of the enumeration request must be 1.
                                    ref ppSessionInfo, // This would point to an array of session info.
                                    ref SessionCount  // This would indicate the length of the above array.
                                    ))
            {
                for (int nCount = 0; nCount < SessionCount; nCount++)
                {
                    WTS_SESSION_INFO tSessionInfo = (WTS_SESSION_INFO)Marshal.PtrToStructure(ppSessionInfo + nCount * Marshal.SizeOf(typeof(WTS_SESSION_INFO)), typeof(WTS_SESSION_INFO));
                    if (WTS_CONNECTSTATE_CLASS.WTSActive == tSessionInfo.State)
                    {
                        IntPtr hToken = IntPtr.Zero;
                        if (WTSQueryUserToken(tSessionInfo.SessionID, out hToken))
                        {
                            PROCESS_INFORMATION tProcessInfo;
                            STARTUPINFO tStartUpInfo = new STARTUPINFO();
                            tStartUpInfo.cb = Marshal.SizeOf(typeof(STARTUPINFO));
                            bool ChildProcStarted = CreateProcessAsUser(
                                                                        hToken,             // Token of the logged-on user.
                                                                        ChildProcName,      // Name of the process to be started.
                                                                        null,               // Any command line arguments to be passed.
                                                                        IntPtr.Zero,        // Default Process' attributes.
                                                                        IntPtr.Zero,        // Default Thread's attributes.
                                                                        false,              // Does NOT inherit parent's handles.
                                                                        0,                  // No any specific creation flag.
                                                                        null,               // Default environment path.
                                                                        null,               // Default current directory.
                                                                        ref tStartUpInfo,   // Process Startup Info.
                                                                        out tProcessInfo    // Process information to be returned.
                                                     );
                            if (ChildProcStarted)
                            {
                                CloseHandle(tProcessInfo.hThread);
                                CloseHandle(tProcessInfo.hProcess);
                            }
                            else
                            {
                                ShowServiceMessage("CreateProcessAsUser失败", "CreateProcess");
                            }
                            CloseHandle(hToken);
                            break;
                        }
                    }
                }
                WTSFreeMemory(ppSessionInfo);
            }
        }
    }
}
PluginListener/WindowUtil.cs
New file
@@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
namespace PluginListener
{
    public class WindowIntPtrUtil
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string className, string windowName);
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindowByProcessId(int processId, int threadId);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern uint GetWindowThreadProcessId(IntPtr ptr, out uint processId);
        /// <summary>
        /// 操作窗口 1是激活 6是最小化
        /// </summary>
        /// <param name="ptr"></param>
        /// <param name="command">1是激活 6是最小化</param>
        /// <returns></returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool ShowWindow(IntPtr ptr, int command);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool SendMessage(IntPtr ptr, UInt32 Msg, IntPtr wParam, IntPtr lParam);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool PostMessage(IntPtr ptr, UInt32 Msg, IntPtr wParam, IntPtr lParam);
        public static void KillProcessByIntPtr(IntPtr ptr)
        {
            //GetWindowThreadProcessId(ptr, out uint processId);
            //if (processId == 0) return;
            //Process process = Process.GetProcessById((int)processId);
            //process.Kill();
            //process.WaitForExit();
            CloseWindow(ptr);
        }
        public static void CloseWindow(IntPtr ptr)
        {
            SendMessage(ptr, (UInt32)0x0010, IntPtr.Zero, IntPtr.Zero);
        }
    }
}
PluginListener/log4net.config
New file
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<log4net>
    <!-- 控制台日志配置 -->
    <appender name="Console" type="log4net.Appender.ConsoleAppender">
        <!-- 日志输出格式 -->
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />
        </layout>
    </appender>
    <!-- 文件存储日志配置 -->
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
        <!-- 保存文件的名称 -->
        <file value="./Log/" />
        <appendToFile value="true" />
        <rollingStyle value="Date" />
        <datePattern value="'log_'yyyyMMdd'.log'"/>
        <staticLogFileName value="false"/>
        <!-- 文件的编码方式 -->
        <param name="Encoding" value="UTF-8"/>
        <!-- 每个文件的大小 -->
        <maximumFileSize value="100KB" />
        <!-- 保存文件数量 -->
        <maxSizeRollBackups value="2" />
        <!-- 日志输出格式 -->
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date{ISO8601} [%logger]  %level  %class - %message%newline" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="Console" />
        <appender-ref ref="RollingFile" />
    </root>
</log4net>
PluginListener/packages.config
New file
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="log4net" version="2.0.3" targetFramework="net472" />
  <package id="SuperSocket" version="1.6.6.1" targetFramework="net472" />
  <package id="SuperSocket.ClientEngine" version="0.10.0" targetFramework="net472" />
  <package id="SuperSocket.Engine" version="1.6.6.1" targetFramework="net472" />
  <package id="SuperSocket.ProtoBase" version="1.7.0.17" targetFramework="net472" />
  <package id="System.Collections.Specialized" version="4.3.0" targetFramework="net472" />
  <package id="System.IO" version="4.3.0" targetFramework="net472" />
  <package id="System.Linq" version="4.3.0" targetFramework="net472" />
  <package id="System.Net.NameResolution" version="4.3.0" targetFramework="net472" />
  <package id="System.Net.Security" version="4.3.0" targetFramework="net472" />
  <package id="System.Net.Sockets" version="4.3.0" targetFramework="net472" />
  <package id="System.Runtime" version="4.3.0" targetFramework="net472" />
  <package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net472" />
  <package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net472" />
  <package id="System.Text.Encoding" version="4.3.0" targetFramework="net472" />
  <package id="System.Threading" version="4.3.0" targetFramework="net472" />
</packages>
PluginListener/supersocket.cmd
New file
@@ -0,0 +1,2 @@
@echo off
SuperSocket.SocketService.exe -c %1 %2
PluginListener/supersocket.sh
New file
@@ -0,0 +1,2 @@
#!/bin/bash
mono SuperSocket.SocketService.exe -c $1 $2
SolidWorksListener/App.config
New file
@@ -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>
SolidWorksListener/App.xaml
New file
@@ -0,0 +1,9 @@
<Application x:Class="SolidWorksListener.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:SolidWorksListener"
             Startup="Application_Startup">
    <Application.Resources>
    </Application.Resources>
</Application>
SolidWorksListener/App.xaml.cs
New file
@@ -0,0 +1,34 @@
using System.Windows;
namespace SolidWorksListener
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        public static Listener listener;
        private static System.Threading.Mutex mutex;
        //系统能够识别有名称的互斥,因此可以使用它禁止应用程序启动两次
        //第二个参数可以设置为产品的名称:Application.ProductName
        // 每次启动应用程序,都会验证名称为OnlyRun的互斥是否存在
        protected override void OnStartup(StartupEventArgs e)
        {
            mutex = new System.Threading.Mutex(true, Application.Current.ToString());
            if (mutex.WaitOne(0, false))
            {
                base.OnStartup(e);
            }
            else
            {
                this.Shutdown();
            }
        }
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            listener = new Listener();
            listener.Start();
        }
    }
}
SolidWorksListener/Listener.cs
New file
@@ -0,0 +1,355 @@
using log4net;
using SuperSocket.ClientEngine;
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Timers;
using System.Windows;
namespace SolidWorksListener
{
    public class Listener
    {
        private ILog log = LogManager.GetLogger("Listener");
        private AsyncTcpSession client;
        private long err_count;
        private System.Timers.Timer socketTimer;
        private System.Timers.Timer importTimer;
        private System.Timers.Timer checkInTimer;
        private volatile int is_open = int.MaxValue;
        private int msgInterval = 5000;
        #region 消息
        public static IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;
        public void ShowMessageBox(string message, string title)
        {
            /*if (is_open == 0)
            {
                return;
            }*/
            is_open = 0;
            int res;
            WTSSendMessage(
                WTS_CURRENT_SERVER_HANDLE,
                WTSGetActiveConsoleSessionId(),
                title, title.Length,
                message, message.Length,
                0, 0, out res, true);
            is_open = res;
        }
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern int WTSGetActiveConsoleSessionId();
        [DllImport("wtsapi32.dll", SetLastError = true)]
        public static extern bool WTSSendMessage(
            IntPtr hServer,
            int SessionId,
            String pTitle,
            int TitleLength,
            String pMessage,
            int MessageLength,
            int Style,
            int Timeout,
            out int pResponse,
            bool bWait);
        #endregion
        private void AlertMsg(string msg)
        {
            /// 内置WPF的 不能用
            // alert.Open(msg);
            /*try
            {
                // SwApp = (SldWorks)Marshal.GetActiveObject("SldWorks.Application.28");
                var swApp = (SldWorks)System.Runtime.InteropServices.Marshal.GetActiveObject("SldWorks.Application");
                swApp.SendMsgToUser2(msg, (int)swMessageBoxIcon_e.swMbStop, (int)swMessageBoxBtn_e.swMbOk);
                Marshal.ReleaseComObject(swApp);
            }
            catch (COMException ex)
            {
                log.Error("Attach Sw Failed.", ex);
            }*/
            // WinAPI_Interop.ShowServiceMessage(msg, "提示");
            // ShowMessageBox(msg, "提示");
            string exeDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string alertPath = Path.GetFullPath(Path.Combine(exeDir,"..","Alert.exe"));
            if (File.Exists(alertPath))
            {
                Process.Start(alertPath);
            }
            else
            {
                MessageBox.Show(msg, "提示");
            }
            /// 用MessageBox的 不能用
            /*if (swApp == null)
            {
                int res;
                WTSSendMessage(
                  WTS_CURRENT_SERVER_HANDLE,
                  WTSGetActiveConsoleSessionId(),//获得当前显示的桌面所在的SessionID
                          "提示", "提示".Length,
                  msg, msg.Length,
                  0, 0, out res, false);
            }
            else
            {
                swApp.SendMsgToUser2(msg, (int)swMessageBoxIcon_e.swMbStop, (int)swMessageBoxBtn_e.swMbOk);
            }*/
            //
            ///启动exe的
            /*ProcessStartInfo psi = new ProcessStartInfo
            {
                FileName = "AlertWindow.exe",
                UseShellExecute = false,
                CreateNoWindow = true
            };
            Process process = Process.Start(psi);*/
        }
        public Listener()
        {
            client = new AsyncTcpSession();
            client.Connected += Client_Connected;
            client.Error += Client_Error;
            client.Closed += Client_Closed;
            client.DataReceived += Client_DataReceived;
            log.Info("Service Started.");
        }
        public void Start()
        {
            InitSocketTimer();
        }
        public void Stop()
        {
            socketTimer?.Stop();
            StopInterceptTimer();
            // alert.DoClose();
            // if (intercepter != null) intercepter.StopIntercept();
        }
        /// <summary>
        /// 启动Socket定时器
        /// </summary>
        public void InitSocketTimer()
        {
            log.Info("Starting Socket Timer...");
            socketTimer = new System.Timers.Timer(msgInterval);
            socketTimer.Elapsed += Timer_Elapsed;
            socketTimer.Enabled = true;
            socketTimer.Start();
            log.Info("Started Socket Timer!");
        }
        /// <summary>
        /// 启动金蝶拦截任务
        /// </summary>
        public void StartInterceptTimer()
        {
            // if (intercepter == null) intercepter = new Intercepter(ListenImportHandle, ListenCheckInHandle);
            if (importTimer == null)
            {
                importTimer = new System.Timers.Timer(500);
                importTimer.Elapsed += ImportTimer_Elapsed;
            }
            importTimer.Start();
            if (checkInTimer == null)
            {
                checkInTimer = new System.Timers.Timer(500);
                checkInTimer.Elapsed += CheckInTimer_Elapsed;
            }
            checkInTimer.Start();
        }
        private void ImportTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (importTimer)
            {
                ListenImportHandle();
            }
        }
        private void CheckInTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (checkInTimer)
            {
                ListenCheckInHandle();
            }
        }
        /// <summary>
        /// 停止金蝶拦截任务
        /// </summary>
        private void StopInterceptTimer()
        {
            /*if (intercepter != null)
            {
                intercepter.StopIntercept();
                intercepter = null;
            }*/
            importTimer?.Stop();
            checkInTimer?.Stop();
        }
        /// <summary>
        /// 插件返回正常时的处理
        /// </summary>
        private void HandleNormal()
        {
            err_count = 0;
            StopInterceptTimer();
            // alert.DoHide();
        }
        private bool IsSwRunning()
        {
            Process[] ps = Process.GetProcessesByName("SLDWORKS");
            bool IsRunning = (ps != null && ps.Length > 0);
            log.Debug($"Sw Is Running: {IsRunning}");
            return IsRunning;
        }
        /// <summary>
        /// 插件返回异常时的处理
        /// </summary>
        private void HandleErr()
        {
            log.Debug($"err_count: {err_count}");
            if (++err_count > 3)
            {
                if (IsSwRunning())
                {
                    // 如果solidworks启动
                    StartInterceptTimer();
                    log.Debug("Ready to show Msg.");
                    AlertMsg("请启用插件并登录");
                    err_count = 3;
                }
                else
                {
                    HandleNormal();
                }
            }
        }
        /// <summary>
        /// 搜索是否有导入窗口,有就一直最小化,并执行规则检查
        /// </summary>
        /// <returns></returns>
        private void ListenImportHandle()
        {
            IntPtr ptr = WindowIntPtrUtil.FindWindow(null, "Everything");//导入文档
            if (ptr == IntPtr.Zero)
            {
                return;
            }
            WindowIntPtrUtil.KillProcessByIntPtr(ptr);
        }
        /// <summary>
        /// 搜索是否有检入窗口,有就一直最小化,并执行规则检查
        /// </summary>
        /// <returns></returns>
        private void ListenCheckInHandle()
        {
            IntPtr ptr = WindowIntPtrUtil.FindWindow(null, "检入文档");
            if (ptr == IntPtr.Zero)
            {
                return;
            }
            WindowIntPtrUtil.KillProcessByIntPtr(ptr);
        }
        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            socketTimer.Stop();
            try
            {
                if (!client.IsConnected)
                {
                    client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5678));
                }
                else
                {
                    var msg = Encoding.Default.GetBytes("HeatBeat");
                    client.Send(msg, 0, msg.Length);
                }
            }
            catch (Exception ex)
            {
                HandleErr();
            }
            finally
            {
                socketTimer.Start();
            }
        }
        /// <summary>
        /// 接收到消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Client_DataReceived(object sender, DataEventArgs e)
        {
            byte flag = e.Data[0];
            if (flag == 1)
            {
                HandleNormal();
            }
            else
            {
                log.Error("Plugin Return 0.");
                HandleErr();
            }
        }
        /// <summary>
        /// 客户端关闭,视为异常
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Client_Closed(object sender, EventArgs e)
        {
            HandleErr();
        }
        /// <summary>
        /// 客户端异常
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Client_Error(object sender, SuperSocket.ClientEngine.ErrorEventArgs e)
        {
            HandleErr();
        }
        /// <summary>
        /// 连接后的操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Client_Connected(object sender, EventArgs e)
        {
        }
    }
}
SolidWorksListener/Properties/AssemblyInfo.cs
New file
@@ -0,0 +1,52 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("SolidWorksListener")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SolidWorksListener")]
[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.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
SolidWorksListener/Properties/Resources.Designer.cs
New file
@@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
//     此代码由工具生成。
//     运行时版本: 4.0.30319.42000
//
//     对此文件的更改可能导致不正确的行为,如果
//     重新生成代码,则所做更改将丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace SolidWorksListener.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("SolidWorksListener.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;
            }
        }
    }
}
SolidWorksListener/Properties/Resources.resx
New file
@@ -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>
SolidWorksListener/Properties/Settings.Designer.cs
New file
@@ -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 SolidWorksListener.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;
            }
        }
    }
}
SolidWorksListener/Properties/Settings.settings
New file
@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
  <Profiles>
    <Profile Name="(Default)" />
  </Profiles>
  <Settings />
</SettingsFile>
SolidWorksListener/SolidWorksListener.csproj
New file
@@ -0,0 +1,198 @@
<?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>{CB3551F6-0C4A-4537-9A04-1E40CD475479}</ProjectGuid>
    <OutputType>WinExe</OutputType>
    <RootNamespace>SolidWorksListener</RootNamespace>
    <AssemblyName>SolidWorksListener</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>..\PdmSw\bin\x64\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>..\PdmSw\bin\x64\Debug\Listener\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <DebugType>full</DebugType>
    <PlatformTarget>x64</PlatformTarget>
    <LangVersion>7.3</LangVersion>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
    <OutputPath>..\PdmSw\bin\x64\Release\Listener\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <Optimize>true</Optimize>
    <DebugType>pdbonly</DebugType>
    <PlatformTarget>x64</PlatformTarget>
    <LangVersion>7.3</LangVersion>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="log4net, Version=1.2.13.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
      <HintPath>..\packages\log4net.2.0.3\lib\net40-full\log4net.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.ClientEngine, Version=0.10.0.0, Culture=neutral, PublicKeyToken=ee9af13f57f00acc, processorArchitecture=MSIL">
      <HintPath>..\packages\SuperSocket.ClientEngine.Core.0.10.0\lib\net45\SuperSocket.ClientEngine.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.Common, Version=1.6.6.1, Culture=neutral, PublicKeyToken=6c80000676988ebb, processorArchitecture=MSIL">
      <HintPath>..\packages\SuperSocket.1.6.6.1\lib\net45\SuperSocket.Common.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.Facility, Version=1.6.6.1, Culture=neutral, PublicKeyToken=6c80000676988ebb, processorArchitecture=MSIL">
      <HintPath>..\packages\SuperSocket.1.6.6.1\lib\net45\SuperSocket.Facility.dll</HintPath>
    </Reference>
    <Reference Include="SuperSocket.SocketBase, Version=1.6.6.1, Culture=neutral, PublicKeyToken=6c80000676988ebb, processorArchitecture=MSIL">
      <HintPath>..\packages\SuperSocket.1.6.6.1\lib\net45\SuperSocket.SocketBase.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Collections.Specialized, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Collections.Specialized.4.3.0\lib\net46\System.Collections.Specialized.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.ComponentModel.Composition" />
    <Reference Include="System.Configuration" />
    <Reference Include="System.Data" />
    <Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Linq, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Linq.4.3.0\lib\net463\System.Linq.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Net.NameResolution, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Net.NameResolution.4.3.0\lib\net46\System.Net.NameResolution.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Net.Security, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Net.Security.4.3.0\lib\net46\System.Net.Security.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Runtime.Extensions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Runtime.InteropServices, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>
    <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="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <Compile Include="WindowUtil.cs" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Listener.cs" />
    <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="log4net.config">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Include="packages.config" />
    <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>
SolidWorksListener/WindowUtil.cs
New file
@@ -0,0 +1,46 @@
using System;
using System.Runtime.InteropServices;
namespace SolidWorksListener
{
    public class WindowIntPtrUtil
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string className, string windowName);
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindowByProcessId(int processId, int threadId);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern uint GetWindowThreadProcessId(IntPtr ptr, out uint processId);
        /// <summary>
        /// 操作窗口 1是激活 6是最小化
        /// </summary>
        /// <param name="ptr"></param>
        /// <param name="command">1是激活 6是最小化</param>
        /// <returns></returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool ShowWindow(IntPtr ptr, int command);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool SendMessage(IntPtr ptr, UInt32 Msg, IntPtr wParam, IntPtr lParam);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool PostMessage(IntPtr ptr, UInt32 Msg, IntPtr wParam, IntPtr lParam);
        public static void KillProcessByIntPtr(IntPtr ptr)
        {
            //GetWindowThreadProcessId(ptr, out uint processId);
            //if (processId == 0) return;
            //Process process = Process.GetProcessById((int)processId);
            //process.Kill();
            //process.WaitForExit();
            CloseWindow(ptr);
        }
        public static void CloseWindow(IntPtr ptr)
        {
            SendMessage(ptr, (UInt32)0x0010, IntPtr.Zero, IntPtr.Zero);
        }
    }
}
SolidWorksListener/log4net.config
New file
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<log4net>
    <!-- 控制台日志配置 -->
    <appender name="Console" type="log4net.Appender.ConsoleAppender">
        <!-- 日志输出格式 -->
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />
        </layout>
    </appender>
    <!-- 文件存储日志配置 -->
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
        <!-- 保存文件的名称 -->
        <file value="./Log/" />
        <appendToFile value="true" />
        <rollingStyle value="Date" />
        <datePattern value="'log_'yyyyMMdd'.log'"/>
        <staticLogFileName value="false"/>
        <!-- 文件的编码方式 -->
        <param name="Encoding" value="UTF-8"/>
        <!-- 每个文件的大小 -->
        <maximumFileSize value="100KB" />
        <!-- 保存文件数量 -->
        <maxSizeRollBackups value="2" />
        <!-- 日志输出格式 -->
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date{ISO8601} [%logger]  %level  %class - %message%newline" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="Console" />
        <appender-ref ref="RollingFile" />
    </root>
</log4net>
SolidWorksListener/packages.config
New file
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="log4net" version="2.0.3" targetFramework="net472" />
  <package id="SuperSocket" version="1.6.6.1" targetFramework="net472" />
  <package id="SuperSocket.ClientEngine.Core" version="0.10.0" targetFramework="net472" />
  <package id="System.Collections.Specialized" version="4.3.0" targetFramework="net472" />
  <package id="System.IO" version="4.3.0" targetFramework="net472" />
  <package id="System.Linq" version="4.3.0" targetFramework="net472" />
  <package id="System.Net.NameResolution" version="4.3.0" targetFramework="net472" />
  <package id="System.Net.Security" version="4.3.0" targetFramework="net472" />
  <package id="System.Net.Sockets" version="4.3.0" targetFramework="net472" />
  <package id="System.Runtime" version="4.3.0" targetFramework="net472" />
  <package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net472" />
  <package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net472" />
  <package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net472" />
</packages>
SolidWorksListenerAlert/App.config
New file
@@ -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>
SolidWorksListenerAlert/App.xaml
New file
@@ -0,0 +1,9 @@
<Application x:Class="SolidWorksListenerAlert.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:SolidWorksListenerAlert"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
    </Application.Resources>
</Application>
SolidWorksListenerAlert/App.xaml.cs
New file
@@ -0,0 +1,27 @@
using System.Windows;
namespace SolidWorksListenerAlert
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        private static System.Threading.Mutex mutex;
        //系统能够识别有名称的互斥,因此可以使用它禁止应用程序启动两次
        //第二个参数可以设置为产品的名称:Application.ProductName
        // 每次启动应用程序,都会验证名称为OnlyRun的互斥是否存在
        protected override void OnStartup(StartupEventArgs e)
        {
            mutex = new System.Threading.Mutex(true, Application.Current.ToString());
            if (mutex.WaitOne(0, false))
            {
                base.OnStartup(e);
            }
            else
            {
                this.Shutdown();
            }
        }
    }
}
SolidWorksListenerAlert/MainWindow.xaml
New file
@@ -0,0 +1,18 @@
<Window x:Class="SolidWorksListenerAlert.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:SolidWorksListenerAlert"
        mc:Ignorable="d"
        Topmost="True"
        ShowInTaskbar="False"
        ResizeMode="NoResize"
        WindowStartupLocation="CenterScreen"
        WindowStyle="ToolWindow"
        Title="提示" Height="150" Width="200">
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <Label Margin="0,0,0,20">请启用插件并登录!</Label>
        <Button Click="Button_Click" Padding="8">我知道了</Button>
    </StackPanel>
</Window>
SolidWorksListenerAlert/MainWindow.xaml.cs
New file
@@ -0,0 +1,34 @@
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 SolidWorksListenerAlert
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            Icon = new DrawingImage();
            InitializeComponent();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }
    }
}
SolidWorksListenerAlert/Properties/AssemblyInfo.cs
New file
@@ -0,0 +1,52 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("SolidWorksListenerAlert")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SolidWorksListenerAlert")]
[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.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
SolidWorksListenerAlert/Properties/Resources.Designer.cs
New file
@@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
//     此代码由工具生成。
//     运行时版本: 4.0.30319.42000
//
//     对此文件的更改可能导致不正确的行为,如果
//     重新生成代码,则所做更改将丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace SolidWorksListenerAlert.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("SolidWorksListenerAlert.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;
            }
        }
    }
}
SolidWorksListenerAlert/Properties/Resources.resx
New file
@@ -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>
SolidWorksListenerAlert/Properties/Settings.Designer.cs
New file
@@ -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 SolidWorksListenerAlert.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;
            }
        }
    }
}
SolidWorksListenerAlert/Properties/Settings.settings
New file
@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
  <Profiles>
    <Profile Name="(Default)" />
  </Profiles>
  <Settings />
</SettingsFile>
SolidWorksListenerAlert/SolidWorksListenerAlert.csproj
New file
@@ -0,0 +1,118 @@
<?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>{201D10C1-DC69-4B1A-B759-876E1B94A2BA}</ProjectGuid>
    <OutputType>WinExe</OutputType>
    <RootNamespace>SolidWorksListenerAlert</RootNamespace>
    <AssemblyName>Alert</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>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>..\PdmSw\bin\x64\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <DebugType>full</DebugType>
    <PlatformTarget>x64</PlatformTarget>
    <LangVersion>7.3</LangVersion>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
    <OutputPath>..\PdmSw\bin\x64\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <Optimize>true</Optimize>
    <DebugType>pdbonly</DebugType>
    <PlatformTarget>x64</PlatformTarget>
    <LangVersion>7.3</LangVersion>
    <ErrorReport>prompt</ErrorReport>
    <Prefer32Bit>true</Prefer32Bit>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <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>
    <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>
WpfUI/.vs/WpfUI.csproj.dtbcache.json
@@ -1 +1 @@
{"RootPath":"D:\\Workspace\\PdmSwPlugin2\\WpfUI","ProjectFileName":"WpfUI.csproj","Configuration":"Debug|AnyCPU","FrameworkPath":"","Sources":[{"SourceFile":"AsyncAttacher.cs"},{"SourceFile":"Form1.cs"},{"SourceFile":"Form1.Designer.cs"},{"SourceFile":"Window1.xaml.cs"},{"SourceFile":"App.xaml.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"Properties\\Resources.Designer.cs"},{"SourceFile":"Properties\\Settings.Designer.cs"},{"SourceFile":"obj\\Debug\\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs"},{"SourceFile":"D:\\Workspace\\PdmSwPlugin2\\WpfUI\\obj\\Debug\\Window1.g.cs"},{"SourceFile":"D:\\Workspace\\PdmSwPlugin2\\WpfUI\\obj\\Debug\\App.g.cs"},{"SourceFile":"D:\\Workspace\\PdmSwPlugin2\\WpfUI\\obj\\Debug\\WpfUI_Content.g.cs"}],"References":[{"Reference":"D:\\Workspace\\PdmSwPlugin2\\lib\\Interop.EModelView.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\lib\\log4net.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\IIS\\Microsoft Web Deploy V3\\Newtonsoft.Json.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\bin\\Debug\\PdmSwPlugin.Common.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\bin\\Debug\\PdmSwPlugin.Common.dll"},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\bin\\Debug\\PdmSwPlugin.Main.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\bin\\Debug\\PdmSwPlugin.Main.dll"},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\PresentationCore.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\PresentationFramework.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.sldworks.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.swconst.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.swdocumentmgr.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.swpublished.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\solidworkstools.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\PublicAssemblies\\System.Buffers.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.ComponentModel.DataAnnotations.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Drawing.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\PublicAssemblies\\System.Memory.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Numerics.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\PublicAssemblies\\System.Numerics.Vectors.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\PublicAssemblies\\System.Runtime.CompilerServices.Unsafe.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\PublicAssemblies\\System.Threading.Tasks.Extensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\PublicAssemblies\\System.ValueTuple.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Web.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Windows.Forms.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xaml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\WindowsBase.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\WindowsFormsIntegration.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"D:\\Workspace\\PdmSwPlugin2\\WpfUI\\bin\\Debug\\WpfUI.exe","OutputItemRelativePath":"WpfUI.exe"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}
{"RootPath":"D:\\Workspace\\PdmSwPlugin2\\WpfUI","ProjectFileName":"WpfUI.csproj","Configuration":"Debug|x64","FrameworkPath":"","Sources":[{"SourceFile":"AsyncAttacher.cs"},{"SourceFile":"Form1.cs"},{"SourceFile":"Form1.Designer.cs"},{"SourceFile":"Window1.xaml.cs"},{"SourceFile":"App.xaml.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"Properties\\Resources.Designer.cs"},{"SourceFile":"Properties\\Settings.Designer.cs"},{"SourceFile":"obj\\x64\\Debug\\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs"},{"SourceFile":"D:\\Workspace\\PdmSwPlugin2\\WpfUI\\obj\\x64\\Debug\\Window1.g.cs"},{"SourceFile":"D:\\Workspace\\PdmSwPlugin2\\WpfUI\\obj\\x64\\Debug\\App.g.cs"},{"SourceFile":"D:\\Workspace\\PdmSwPlugin2\\WpfUI\\obj\\x64\\Debug\\WpfUI_Content.g.cs"}],"References":[{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\DuEDrawingControl.1.0.2\\lib\\net461\\DuEDrawingControl.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\lib\\Interop.EModelView.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\lib\\log4net.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\Microsoft.Bcl.AsyncInterfaces.7.0.0\\lib\\net462\\Microsoft.Bcl.AsyncInterfaces.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\Microsoft.Extensions.DependencyInjection.Abstractions.7.0.0\\lib\\net462\\Microsoft.Extensions.DependencyInjection.Abstractions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\Microsoft.Extensions.DependencyInjection.7.0.0\\lib\\net462\\Microsoft.Extensions.DependencyInjection.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\Microsoft.Extensions.Http.7.0.0\\lib\\net462\\Microsoft.Extensions.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\Microsoft.Extensions.Logging.Abstractions.7.0.0\\lib\\net462\\Microsoft.Extensions.Logging.Abstractions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\Microsoft.Extensions.Logging.7.0.0\\lib\\net462\\Microsoft.Extensions.Logging.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\Microsoft.Extensions.Options.7.0.0\\lib\\net462\\Microsoft.Extensions.Options.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\Microsoft.Extensions.Primitives.7.0.0\\lib\\net462\\Microsoft.Extensions.Primitives.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\Newtonsoft.Json.13.0.3\\lib\\net45\\Newtonsoft.Json.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\bin\\x64\\Debug\\PdmSwPlugin.Common.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\bin\\x64\\Debug\\PdmSwPlugin.Common.dll"},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\bin\\x64\\Debug\\PdmSwPlugin.Main.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":"D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\bin\\x64\\Debug\\PdmSwPlugin.Main.dll"},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\PresentationCore.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\PresentationFramework.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.sldworks.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.swconst.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.swdocumentmgr.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\api\\redist\\SolidWorks.Interop.swpublished.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files\\SOLIDWORKS Corp\\SOLIDWORKS\\solidworkstools.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\System.Buffers.4.5.1\\lib\\net461\\System.Buffers.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.ComponentModel.DataAnnotations.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\System.Diagnostics.DiagnosticSource.7.0.0\\lib\\net462\\System.Diagnostics.DiagnosticSource.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Drawing.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\System.Memory.4.5.5\\lib\\net461\\System.Memory.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Numerics.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\System.Numerics.Vectors.4.5.0\\lib\\net46\\System.Numerics.Vectors.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\System.Runtime.CompilerServices.Unsafe.6.0.0\\lib\\net461\\System.Runtime.CompilerServices.Unsafe.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\System.Text.Encodings.Web.7.0.0\\lib\\net462\\System.Text.Encodings.Web.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\System.Threading.Tasks.Extensions.4.5.4\\lib\\net461\\System.Threading.Tasks.Extensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\Workspace\\PdmSwPlugin2\\PdmSw\\packages\\System.ValueTuple.4.5.0\\lib\\net47\\System.ValueTuple.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Web.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Windows.Forms.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xaml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\WindowsBase.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\WindowsFormsIntegration.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"D:\\Workspace\\PdmSwPlugin2\\WpfUI\\bin\\x64\\Debug\\WpfUI.exe","OutputItemRelativePath":"WpfUI.exe"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}
WpfUI/Window1.xaml.cs
@@ -24,8 +24,6 @@
            GlobalConfig = PluginSetting.Instance;
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (SwApp != null)
lib/SuperSocket.Common.XML
New file
@@ -0,0 +1,1346 @@
<?xml version="1.0"?>
<doc>
    <assembly>
        <name>SuperSocket.Common</name>
    </assembly>
    <members>
        <member name="P:SuperSocket.Common.ArraySegmentEx`1.Array">
            <summary>
            Gets the array.
            </summary>
        </member>
        <member name="P:SuperSocket.Common.ArraySegmentEx`1.Count">
            <summary>
            Gets the count.
            </summary>
        </member>
        <member name="P:SuperSocket.Common.ArraySegmentEx`1.Offset">
            <summary>
            Gets the offset.
            </summary>
        </member>
        <member name="T:SuperSocket.Common.ArraySegmentList`1">
            <summary>
            ArraySegmentList
            </summary>
            <typeparam name="T"></typeparam>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.#ctor">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Common.ArraySegmentList`1"/> class.
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.IndexOf(`0)">
            <summary>
            Determines the index of a specific item in the <see cref="T:System.Collections.Generic.IList`1"/>.
            </summary>
            <param name="item">The object to locate in the <see cref="T:System.Collections.Generic.IList`1"/>.</param>
            <returns>
            The index of <paramref name="item"/> if found in the list; otherwise, -1.
            </returns>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.Insert(System.Int32,`0)">
            <summary>
            NotSupported
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.RemoveAt(System.Int32)">
            <summary>
            NotSupported
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.Add(`0)">
            <summary>
            NotSupported
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.Clear">
            <summary>
            NotSupported
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.Contains(`0)">
            <summary>
            NotSupported
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.CopyTo(`0[],System.Int32)">
            <summary>
            Copies to.
            </summary>
            <param name="array">The array.</param>
            <param name="arrayIndex">Index of the array.</param>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.Remove(`0)">
            <summary>
            NotSupported
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.GetEnumerator">
            <summary>
            NotSupported
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.System#Collections#IEnumerable#GetEnumerator">
            <summary>
            NotSupported
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.RemoveSegmentAt(System.Int32)">
            <summary>
            Removes the segment at.
            </summary>
            <param name="index">The index.</param>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.AddSegment(`0[],System.Int32,System.Int32)">
            <summary>
            Adds the segment to the list.
            </summary>
            <param name="array">The array.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.AddSegment(`0[],System.Int32,System.Int32,System.Boolean)">
            <summary>
            Adds the segment to the list.
            </summary>
            <param name="array">The array.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.ClearSegements">
            <summary>
            Clears all the segements.
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.ToArrayData">
            <summary>
            Read all data in this list to the array data.
            </summary>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.ToArrayData(System.Int32,System.Int32)">
            <summary>
            Read the data in specific range to the array data.
            </summary>
            <param name="startIndex">The start index.</param>
            <param name="length">The length.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.TrimEnd(System.Int32)">
            <summary>
            Trims the end.
            </summary>
            <param name="trimSize">Size of the trim.</param>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.SearchLastSegment(SuperSocket.Common.SearchMarkState{`0})">
            <summary>
            Searches the last segment.
            </summary>
            <param name="state">The state.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.CopyTo(`0[])">
            <summary>
            Copies to.
            </summary>
            <param name="to">To.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList`1.CopyTo(`0[],System.Int32,System.Int32,System.Int32)">
            <summary>
            Copies to.
            </summary>
            <param name="to">To.</param>
            <param name="srcIndex">Index of the SRC.</param>
            <param name="toIndex">To index.</param>
            <param name="length">The length.</param>
            <returns></returns>
        </member>
        <member name="P:SuperSocket.Common.ArraySegmentList`1.Item(System.Int32)">
            <summary>
            Gets or sets the element at the specified index.
            </summary>
            <returns>
            The element at the specified index.
              </returns>
            <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="index"/> is not a valid index in the <see cref="T:System.Collections.Generic.IList`1"/>.
              </exception>
            <exception cref="T:System.NotSupportedException">
            The property is set and the <see cref="T:System.Collections.Generic.IList`1"/> is read-only.
              </exception>
        </member>
        <member name="P:SuperSocket.Common.ArraySegmentList`1.Count">
            <summary>
            Gets the number of elements contained in the <see cref="T:System.Collections.Generic.ICollection`1"/>.
            </summary>
            <returns>
            The number of elements contained in the <see cref="T:System.Collections.Generic.ICollection`1"/>.
              </returns>
        </member>
        <member name="P:SuperSocket.Common.ArraySegmentList`1.IsReadOnly">
            <summary>
            Gets a value indicating whether the <see cref="T:System.Collections.Generic.ICollection`1"/> is read-only.
            </summary>
            <returns>true if the <see cref="T:System.Collections.Generic.ICollection`1"/> is read-only; otherwise, false.
              </returns>
        </member>
        <member name="P:SuperSocket.Common.ArraySegmentList`1.SegmentCount">
            <summary>
            Gets the segment count.
            </summary>
        </member>
        <member name="T:SuperSocket.Common.ArraySegmentList">
            <summary>
            ArraySegmentList
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList.Decode(System.Text.Encoding)">
            <summary>
            Decodes bytes to string by the specified encoding.
            </summary>
            <param name="encoding">The encoding.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList.Decode(System.Text.Encoding,System.Int32,System.Int32)">
            <summary>
            Decodes bytes to string by the specified encoding.
            </summary>
            <param name="encoding">The encoding.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.ArraySegmentList.DecodeMask(System.Byte[],System.Int32,System.Int32)">
            <summary>
            Decodes data by the mask.
            </summary>
            <param name="mask">The mask.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
        </member>
        <member name="T:SuperSocket.Common.AssemblyUtil">
            <summary>
            Assembly Util Class
            </summary>
        </member>
        <member name="M:SuperSocket.Common.AssemblyUtil.CreateInstance``1(System.String)">
            <summary>
            Creates the instance from type name.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="type">The type.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.AssemblyUtil.CreateInstance``1(System.String,System.Object[])">
            <summary>
            Creates the instance from type name and parameters.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="type">The type.</param>
            <param name="parameters">The parameters.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.AssemblyUtil.GetType(System.String,System.Boolean,System.Boolean)">
            <summary>
            Gets the type by the full name, also return matched generic type without checking generic type parameters in the name.
            </summary>
            <param name="fullTypeName">Full name of the type.</param>
            <param name="throwOnError">if set to <c>true</c> [throw on error].</param>
            <param name="ignoreCase">if set to <c>true</c> [ignore case].</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.AssemblyUtil.GetImplementTypes``1(System.Reflection.Assembly)">
            <summary>
            Gets the implement types from assembly.
            </summary>
            <typeparam name="TBaseType">The type of the base type.</typeparam>
            <param name="assembly">The assembly.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.AssemblyUtil.GetImplementedObjectsByInterface``1(System.Reflection.Assembly)">
            <summary>
            Gets the implemented objects by interface.
            </summary>
            <typeparam name="TBaseInterface">The type of the base interface.</typeparam>
            <param name="assembly">The assembly.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.AssemblyUtil.GetImplementedObjectsByInterface``1(System.Reflection.Assembly,System.Type)">
            <summary>
            Gets the implemented objects by interface.
            </summary>
            <typeparam name="TBaseInterface">The type of the base interface.</typeparam>
            <param name="assembly">The assembly.</param>
            <param name="targetType">Type of the target.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.AssemblyUtil.BinaryClone``1(``0)">
            <summary>
            Clone object in binary format.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="target">The target.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.AssemblyUtil.CopyPropertiesTo``1(``0,``0)">
            <summary>
            Copies the properties of one object to another object.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="target">The target.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.AssemblyUtil.CopyPropertiesTo``1(``0,System.Predicate{System.Reflection.PropertyInfo},``0)">
            <summary>
            Copies the properties of one object to another object.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="predict">The properties predict.</param>
            <param name="target">The target.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.AssemblyUtil.GetAssembliesFromString(System.String)">
            <summary>
            Gets the assemblies from string.
            </summary>
            <param name="assemblyDef">The assembly def.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.AssemblyUtil.GetAssembliesFromStrings(System.String[])">
            <summary>
            Gets the assemblies from strings.
            </summary>
            <param name="assemblies">The assemblies.</param>
            <returns></returns>
        </member>
        <member name="T:SuperSocket.Common.BinaryUtil">
            <summary>
            Binary util class
            </summary>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.IndexOf``1(System.Collections.Generic.IList{``0},``0,System.Int32,System.Int32)">
            <summary>
            Search target from source.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="target">The target.</param>
            <param name="pos">The pos.</param>
            <param name="length">The length.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.SearchMark``1(System.Collections.Generic.IList{``0},``0[],System.Int32@)">
            <summary>
            Searches the mark from source.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="mark">The mark.</param>
            <param name="parsedLength">Length of the parsed.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.SearchMark``1(System.Collections.Generic.IList{``0},``0[])">
            <summary>
            Searches the mark from source.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="mark">The mark.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.SearchMark``1(System.Collections.Generic.IList{``0},System.Int32,System.Int32,``0[])">
            <summary>
            Searches the mark from source.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="mark">The mark.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.SearchMark``1(System.Collections.Generic.IList{``0},System.Int32,System.Int32,``0[],System.Int32@)">
            <summary>
            Searches the mark from source.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="mark">The mark.</param>
            <param name="parsedLength">Length of the parsed.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.SearchMark``1(System.Collections.Generic.IList{``0},System.Int32,System.Int32,``0[],System.Int32)">
            <summary>
            Searches the mark from source.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="mark">The mark.</param>
            <param name="matched">The matched.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.SearchMark``1(System.Collections.Generic.IList{``0},System.Int32,System.Int32,``0[],System.Int32,System.Int32@)">
            <summary>
            Searches the mark from source.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="mark">The mark.</param>
            <param name="matched">The matched.</param>
            <param name="parsedLength">Length of the parsed.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.SearchMark``1(System.Collections.Generic.IList{``0},System.Int32,System.Int32,SuperSocket.Common.SearchMarkState{``0},System.Int32@)">
            <summary>
            Searches the mark from source.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="searchState">State of the search.</param>
            <param name="parsedLength">Length of the parsed.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.SearchMark``1(System.Collections.Generic.IList{``0},System.Int32,System.Int32,SuperSocket.Common.SearchMarkState{``0})">
            <summary>
            Searches the mark from source.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="searchState">State of the search.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.StartsWith``1(System.Collections.Generic.IList{``0},``0[])">
            <summary>
            Startses the with.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="mark">The mark.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.StartsWith``1(System.Collections.Generic.IList{``0},System.Int32,System.Int32,``0[])">
            <summary>
            Startses the with.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="mark">The mark.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.EndsWith``1(System.Collections.Generic.IList{``0},``0[])">
            <summary>
            Endses the with.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="mark">The mark.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.EndsWith``1(System.Collections.Generic.IList{``0},System.Int32,System.Int32,``0[])">
            <summary>
            Endses the with.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="mark">The mark.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.BinaryUtil.CloneRange``1(System.Collections.Generic.IList{``0},System.Int32,System.Int32)">
            <summary>
            Clones the elements in the specific range.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="source">The source.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <returns></returns>
        </member>
        <member name="T:SuperSocket.Common.BufferManager">
            <summary>
            This class creates a single large buffer which can be divided up and assigned to SocketAsyncEventArgs objects for use
            with each socket I/O operation.  This enables bufffers to be easily reused and gaurds against fragmenting heap memory.
            The operations exposed on the BufferManager class are not thread safe.
            </summary>
        </member>
        <member name="M:SuperSocket.Common.BufferManager.#ctor(System.Int32,System.Int32)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Common.BufferManager"/> class.
            </summary>
            <param name="totalBytes">The total bytes.</param>
            <param name="bufferSize">Size of the buffer.</param>
        </member>
        <member name="M:SuperSocket.Common.BufferManager.InitBuffer">
            <summary>
            Allocates buffer space used by the buffer pool
            </summary>
        </member>
        <member name="M:SuperSocket.Common.BufferManager.SetBuffer(System.Net.Sockets.SocketAsyncEventArgs)">
            <summary>
            Assigns a buffer from the buffer pool to the specified SocketAsyncEventArgs object
            </summary>
            <returns>true if the buffer was successfully set, else false</returns>
        </member>
        <member name="M:SuperSocket.Common.BufferManager.FreeBuffer(System.Net.Sockets.SocketAsyncEventArgs)">
            <summary>
            Removes the buffer from a SocketAsyncEventArg object.  This frees the buffer back to the
            buffer pool
            </summary>
        </member>
        <member name="T:SuperSocket.Common.ConfigurationElementBase">
            <summary>
            ConfigurationElementBase
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationElementBase.#ctor">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Common.ConfigurationElementBase"/> class.
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationElementBase.#ctor(System.Boolean)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Common.ConfigurationElementBase"/> class.
            </summary>
            <param name="nameRequired">if set to <c>true</c> [name required].</param>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationElementBase.DeserializeElement(System.Xml.XmlReader,System.Boolean)">
            <summary>
            Reads XML from the configuration file.
            </summary>
            <param name="reader">The <see cref="T:System.Xml.XmlReader"/> that reads from the configuration file.</param>
            <param name="serializeCollectionKey">true to serialize only the collection key properties; otherwise, false.</param>
            <exception cref="T:System.Configuration.ConfigurationErrorsException">The element to read is locked.- or -An attribute of the current node is not recognized.- or -The lock status of the current node cannot be determined.  </exception>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationElementBase.OnDeserializeUnrecognizedAttribute(System.String,System.String)">
            <summary>
            Gets a value indicating whether an unknown attribute is encountered during deserialization.
            </summary>
            <param name="name">The name of the unrecognized attribute.</param>
            <param name="value">The value of the unrecognized attribute.</param>
            <returns>
            true when an unknown attribute is encountered while deserializing; otherwise, false.
            </returns>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationElementBase.Unmerge(System.Configuration.ConfigurationElement,System.Configuration.ConfigurationElement,System.Configuration.ConfigurationSaveMode)">
            <summary>
            Modifies the <see cref="T:System.Configuration.ConfigurationElement" /> object to remove all values that should not be saved.
            </summary>
            <param name="sourceElement">A <see cref="T:System.Configuration.ConfigurationElement" /> at the current level containing a merged view of the properties.</param>
            <param name="parentElement">The parent <see cref="T:System.Configuration.ConfigurationElement" />, or null if this is the top level.</param>
            <param name="saveMode">A <see cref="T:System.Configuration.ConfigurationSaveMode" /> that determines which property values to include.</param>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationElementBase.SerializeElement(System.Xml.XmlWriter,System.Boolean)">
            <summary>
            Writes the contents of this configuration element to the configuration file when implemented in a derived class.
            </summary>
            <param name="writer">The <see cref="T:System.Xml.XmlWriter" /> that writes to the configuration file.</param>
            <param name="serializeCollectionKey">true to serialize only the collection key properties; otherwise, false.</param>
            <returns>
            true if any data was actually serialized; otherwise, false.
            </returns>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationElementBase.OnDeserializeUnrecognizedElement(System.String,System.Xml.XmlReader)">
            <summary>
            Gets a value indicating whether an unknown element is encountered during deserialization.
            </summary>
            <param name="elementName">The name of the unknown subelement.</param>
            <param name="reader">The <see cref="T:System.Xml.XmlReader"/> being used for deserialization.</param>
            <returns>
            true when an unknown element is encountered while deserializing; otherwise, false.
            </returns>
            <exception cref="T:System.Configuration.ConfigurationErrorsException">The element identified by <paramref name="elementName"/> is locked.- or -One or more of the element's attributes is locked.- or -<paramref name="elementName"/> is unrecognized, or the element has an unrecognized attribute.- or -The element has a Boolean attribute with an invalid value.- or -An attempt was made to deserialize a property more than once.- or -An attempt was made to deserialize a property that is not a valid member of the element.- or -The element cannot contain a CDATA or text element.</exception>
        </member>
        <member name="P:SuperSocket.Common.ConfigurationElementBase.Name">
            <summary>
            Gets the name.
            </summary>
        </member>
        <member name="P:SuperSocket.Common.ConfigurationElementBase.Options">
            <summary>
            Gets the options.
            </summary>
        </member>
        <member name="P:SuperSocket.Common.ConfigurationElementBase.OptionElements">
            <summary>
            Gets the option elements.
            </summary>
        </member>
        <member name="T:SuperSocket.Common.ConfigurationExtension">
            <summary>
            Configuration extension class
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationExtension.GetValue(System.Collections.Specialized.NameValueCollection,System.String)">
            <summary>
            Gets the value from namevalue collection by key.
            </summary>
            <param name="collection">The collection.</param>
            <param name="key">The key.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationExtension.GetValue(System.Collections.Specialized.NameValueCollection,System.String,System.String)">
            <summary>
            Gets the value from namevalue collection by key.
            </summary>
            <param name="collection">The collection.</param>
            <param name="key">The key.</param>
            <param name="defaultValue">The default value.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationExtension.Deserialize``1(``0,System.Xml.XmlReader)">
            <summary>
            Deserializes the specified configuration section.
            </summary>
            <typeparam name="TElement">The type of the element.</typeparam>
            <param name="section">The section.</param>
            <param name="reader">The reader.</param>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationExtension.DeserializeChildConfig``1(System.String)">
            <summary>
            Deserializes the child configuration.
            </summary>
            <typeparam name="TConfig">The type of the configuration.</typeparam>
            <param name="childConfig">The child configuration string.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationExtension.GetChildConfig``1(System.Collections.Specialized.NameValueCollection,System.String)">
            <summary>
            Gets the child config.
            </summary>
            <typeparam name="TConfig">The type of the config.</typeparam>
            <param name="childElements">The child elements.</param>
            <param name="childConfigName">Name of the child config.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationExtension.GetConfigSource(System.Configuration.ConfigurationElement)">
            <summary>
            Gets the config source path.
            </summary>
            <param name="config">The config.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationExtension.LoadFrom(System.Configuration.ConfigurationElement,System.Object)">
            <summary>
            Loads configuration element's node information from a model.
            </summary>
            <param name="configElement">The config element.</param>
            <param name="source">The source.</param>
            <exception cref="T:System.Exception">Cannot find expected property 'Item' from the type 'ConfigurationElement'.</exception>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationExtension.GetCurrentConfiguration(System.Configuration.ConfigurationElement)">
            <summary>
            Gets the current configuration of the configuration element.
            </summary>
            <returns>The current configuration.</returns>
            <param name="configElement">Configuration element.</param>
        </member>
        <member name="M:SuperSocket.Common.ConfigurationExtension.ResetConfiguration(System.AppDomain,System.String)">
            <summary>
            Reset application's configuration to a another config file
            </summary>
            <param name="appDomain">the assosiated AppDomain</param>
            <param name="configFilePath">the config file path want to reset to</param>
        </member>
        <member name="T:SuperSocket.Common.DictionaryExtension">
            <summary>
            Extension class for IDictionary
            </summary>
        </member>
        <member name="M:SuperSocket.Common.DictionaryExtension.GetValue``1(System.Collections.Generic.IDictionary{System.Object,System.Object},System.Object)">
            <summary>
            Gets the value by key.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="dictionary">The dictionary.</param>
            <param name="key">The key.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.DictionaryExtension.GetValue``1(System.Collections.Generic.IDictionary{System.Object,System.Object},System.Object,``0)">
            <summary>
            Gets the value by key and default value.
            </summary>
            <typeparam name="T"></typeparam>
            <param name="dictionary">The dictionary.</param>
            <param name="key">The key.</param>
            <param name="defaultValue">The default value.</param>
            <returns></returns>
        </member>
        <member name="T:SuperSocket.Common.ErrorEventArgs">
            <summary>
            EventArgs for error and exception
            </summary>
        </member>
        <member name="M:SuperSocket.Common.ErrorEventArgs.#ctor(System.String)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Common.ErrorEventArgs"/> class.
            </summary>
            <param name="message">The message.</param>
        </member>
        <member name="M:SuperSocket.Common.ErrorEventArgs.#ctor(System.Exception)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Common.ErrorEventArgs"/> class.
            </summary>
            <param name="exception">The exception.</param>
        </member>
        <member name="P:SuperSocket.Common.ErrorEventArgs.Exception">
            <summary>
            Gets the exception.
            </summary>
        </member>
        <member name="T:SuperSocket.Common.GenericConfigurationElementCollectionBase`2">
            <summary>
            GenericConfigurationElementCollectionBase
            </summary>
            <typeparam name="TConfigElement">The type of the config element.</typeparam>
            <typeparam name="TConfigInterface">The type of the config interface.</typeparam>
        </member>
        <member name="M:SuperSocket.Common.GenericConfigurationElementCollectionBase`2.CreateNewElement">
            <summary>
            When overridden in a derived class, creates a new <see cref="T:System.Configuration.ConfigurationElement"/>.
            </summary>
            <returns>
            A new <see cref="T:System.Configuration.ConfigurationElement"/>.
            </returns>
        </member>
        <member name="M:SuperSocket.Common.GenericConfigurationElementCollectionBase`2.GetElementKey(System.Configuration.ConfigurationElement)">
            <summary>
            Gets the element key for a specified configuration element when overridden in a derived class.
            </summary>
            <param name="element">The <see cref="T:System.Configuration.ConfigurationElement"/> to return the key for.</param>
            <returns>
            An <see cref="T:System.Object"/> that acts as the key for the specified <see cref="T:System.Configuration.ConfigurationElement"/>.
            </returns>
        </member>
        <member name="M:SuperSocket.Common.GenericConfigurationElementCollectionBase`2.GetEnumerator">
            <summary>
            Returns an enumerator that iterates through the collection.
            </summary>
            <returns>
            A <see cref="T:System.Collections.Generic.IEnumerator`1"/> that can be used to iterate through the collection.
            </returns>
        </member>
        <member name="P:SuperSocket.Common.GenericConfigurationElementCollectionBase`2.Item(System.Int32)">
            <summary>
            Gets or sets a property, attribute, or child element of this configuration element.
            </summary>
            <returns>The specified property, attribute, or child element</returns>
        </member>
        <member name="T:SuperSocket.Common.GenericConfigurationElementCollection`2">
            <summary>
            GenericConfigurationElementCollection
            </summary>
            <typeparam name="TConfigElement">The type of the config element.</typeparam>
            <typeparam name="TConfigInterface">The type of the config interface.</typeparam>
        </member>
        <member name="M:SuperSocket.Common.GenericConfigurationElementCollection`2.GetElementKey(System.Configuration.ConfigurationElement)">
            <summary>
            Gets the element key.
            </summary>
            <param name="element">The element.</param>
            <returns></returns>
        </member>
        <member name="T:SuperSocket.Common.Platform">
            <summary>
            This class is designed for detect platform attribute in runtime
            </summary>
        </member>
        <member name="P:SuperSocket.Common.Platform.SupportSocketIOControlByCodeEnum">
            <summary>
            Gets a value indicating whether [support socket IO control by code enum].
            </summary>
            <value>
                <c>true</c> if [support socket IO control by code enum]; otherwise, <c>false</c>.
            </value>
        </member>
        <member name="P:SuperSocket.Common.Platform.IsMono">
            <summary>
            Gets a value indicating whether this instance is mono.
            </summary>
            <value>
              <c>true</c> if this instance is mono; otherwise, <c>false</c>.
            </value>
        </member>
        <member name="T:SuperSocket.Common.SearchMarkState`1">
            <summary>
            SearchMarkState
            </summary>
            <typeparam name="T"></typeparam>
        </member>
        <member name="M:SuperSocket.Common.SearchMarkState`1.#ctor(`0[])">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Common.SearchMarkState`1"/> class.
            </summary>
            <param name="mark">The mark.</param>
        </member>
        <member name="P:SuperSocket.Common.SearchMarkState`1.Mark">
            <summary>
            Gets the mark.
            </summary>
        </member>
        <member name="P:SuperSocket.Common.SearchMarkState`1.Matched">
            <summary>
            Gets or sets whether matched already.
            </summary>
            <value>
            The matched.
            </value>
        </member>
        <member name="T:SuperSocket.Common.SendingQueue">
            <summary>
            SendingQueue
            </summary>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.#ctor(System.ArraySegment{System.Byte}[],System.Int32,System.Int32)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Common.SendingQueue"/> class.
            </summary>
            <param name="globalQueue">The global queue.</param>
            <param name="offset">The offset.</param>
            <param name="capacity">The capacity.</param>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.Enqueue(System.ArraySegment{System.Byte},System.UInt16)">
            <summary>
            Enqueues the specified item.
            </summary>
            <param name="item">The item.</param>
            <param name="trackID">The track ID.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.Enqueue(System.Collections.Generic.IList{System.ArraySegment{System.Byte}},System.UInt16)">
            <summary>
            Enqueues the specified items.
            </summary>
            <param name="items">The items.</param>
            <param name="trackID">The track ID.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.StopEnqueue">
            <summary>
            Stops the enqueue, and then wait all current excueting enqueu threads exit.
            </summary>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.StartEnqueue">
            <summary>
            Starts to allow enqueue.
            </summary>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.IndexOf(System.ArraySegment{System.Byte})">
            <summary>
            Determines the index of a specific item in the <see cref="T:System.Collections.Generic.IList`1"/>.
            </summary>
            <param name="item">The object to locate in the <see cref="T:System.Collections.Generic.IList`1"/>.</param>
            <returns>
            The index of <paramref name="item"/> if found in the list; otherwise, -1.
            </returns>
            <exception cref="T:System.NotSupportedException"></exception>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.Insert(System.Int32,System.ArraySegment{System.Byte})">
            <summary>
            Inserts an item to the <see cref="T:System.Collections.Generic.IList`1"/> at the specified index.
            </summary>
            <param name="index">The zero-based index at which <paramref name="item"/> should be inserted.</param>
            <param name="item">The object to insert into the <see cref="T:System.Collections.Generic.IList`1"/>.</param>
            <exception cref="T:System.NotSupportedException"></exception>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.RemoveAt(System.Int32)">
            <summary>
            Removes the <see cref="T:System.Collections.Generic.IList`1"/> item at the specified index.
            </summary>
            <param name="index">The zero-based index of the item to remove.</param>
            <exception cref="T:System.NotSupportedException"></exception>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.Add(System.ArraySegment{System.Byte})">
            <summary>
            Adds an item to the <see cref="T:System.Collections.Generic.ICollection`1"/>.
            </summary>
            <param name="item">The object to add to the <see cref="T:System.Collections.Generic.ICollection`1"/>.</param>
            <exception cref="T:System.NotSupportedException"></exception>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.Clear">
            <summary>
            Removes all items from the <see cref="T:System.Collections.Generic.ICollection`1"/>.
            </summary>
            <exception cref="T:System.NotSupportedException"></exception>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.Contains(System.ArraySegment{System.Byte})">
            <summary>
            Determines whether the <see cref="T:System.Collections.Generic.ICollection`1"/> contains a specific value.
            </summary>
            <param name="item">The object to locate in the <see cref="T:System.Collections.Generic.ICollection`1"/>.</param>
            <returns>
            true if <paramref name="item"/> is found in the <see cref="T:System.Collections.Generic.ICollection`1"/>; otherwise, false.
            </returns>
            <exception cref="T:System.NotSupportedException"></exception>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.CopyTo(System.ArraySegment{System.Byte}[],System.Int32)">
            <summary>
            Copies to.
            </summary>
            <param name="array">The array.</param>
            <param name="arrayIndex">Index of the array.</param>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.Remove(System.ArraySegment{System.Byte})">
            <summary>
            Removes the first occurrence of a specific object from the <see cref="T:System.Collections.Generic.ICollection`1"/>.
            </summary>
            <param name="item">The object to remove from the <see cref="T:System.Collections.Generic.ICollection`1"/>.</param>
            <returns>
            true if <paramref name="item"/> was successfully removed from the <see cref="T:System.Collections.Generic.ICollection`1"/>; otherwise, false. This method also returns false if <paramref name="item"/> is not found in the original <see cref="T:System.Collections.Generic.ICollection`1"/>.
            </returns>
            <exception cref="T:System.NotSupportedException"></exception>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.GetEnumerator">
            <summary>
            Returns an enumerator that iterates through the collection.
            </summary>
            <returns>
            A <see cref="T:System.Collections.Generic.IEnumerator`1"/> that can be used to iterate through the collection.
            </returns>
            <exception cref="T:System.NotSupportedException"></exception>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.System#Collections#IEnumerable#GetEnumerator">
            <summary>
            Returns an enumerator that iterates through a collection.
            </summary>
            <returns>
            An <see cref="T:System.Collections.IEnumerator"/> object that can be used to iterate through the collection.
            </returns>
            <exception cref="T:System.NotSupportedException"></exception>
        </member>
        <member name="M:SuperSocket.Common.SendingQueue.InternalTrim(System.Int32)">
            <summary>
            Trim the internal segments at the begining by the binary data size.
            </summary>
            <param name="offset">The binary data size should be trimed at the begining.</param>
        </member>
        <member name="P:SuperSocket.Common.SendingQueue.TrackID">
            <summary>
            Gets the track ID.
            </summary>
            <value>
            The track ID.
            </value>
        </member>
        <member name="P:SuperSocket.Common.SendingQueue.GlobalQueue">
            <summary>
            Gets the global queue.
            </summary>
            <value>
            The global queue.
            </value>
        </member>
        <member name="P:SuperSocket.Common.SendingQueue.Offset">
            <summary>
            Gets the offset.
            </summary>
            <value>
            The offset.
            </value>
        </member>
        <member name="P:SuperSocket.Common.SendingQueue.Capacity">
            <summary>
            Gets the capacity.
            </summary>
            <value>
            The capacity.
            </value>
        </member>
        <member name="P:SuperSocket.Common.SendingQueue.Count">
            <summary>
            Gets the number of elements contained in the <see cref="T:System.Collections.Generic.ICollection`1" />.
            </summary>
            <returns>The number of elements contained in the <see cref="T:System.Collections.Generic.ICollection`1" />.</returns>
        </member>
        <member name="P:SuperSocket.Common.SendingQueue.Position">
            <summary>
            Gets or sets the position.
            </summary>
            <value>
            The position.
            </value>
        </member>
        <member name="P:SuperSocket.Common.SendingQueue.Item(System.Int32)">
            <summary>
            Gets or sets the element at the specified index.
            </summary>
            <param name="index">The index.</param>
            <returns></returns>
            <exception cref="T:System.NotSupportedException"></exception>
        </member>
        <member name="P:SuperSocket.Common.SendingQueue.IsReadOnly">
            <summary>
            Gets a value indicating whether the <see cref="T:System.Collections.Generic.ICollection`1" /> is read-only.
            </summary>
            <returns>true if the <see cref="T:System.Collections.Generic.ICollection`1" /> is read-only; otherwise, false.</returns>
        </member>
        <member name="T:SuperSocket.Common.SendingQueueSourceCreator">
            <summary>
            SendingQueueSourceCreator
            </summary>
        </member>
        <member name="T:SuperSocket.Common.ISmartPoolSourceCreator`1">
            <summary>
            ISmartPoolSourceCreator
            </summary>
            <typeparam name="T"></typeparam>
        </member>
        <member name="M:SuperSocket.Common.ISmartPoolSourceCreator`1.Create(System.Int32,`0[]@)">
            <summary>
            Creates the specified size.
            </summary>
            <param name="size">The size.</param>
            <param name="poolItems">The pool items.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.SendingQueueSourceCreator.#ctor(System.Int32)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Common.SendingQueueSourceCreator"/> class.
            </summary>
            <param name="sendingQueueSize">Size of the sending queue.</param>
        </member>
        <member name="M:SuperSocket.Common.SendingQueueSourceCreator.Create(System.Int32,SuperSocket.Common.SendingQueue[]@)">
            <summary>
            Creates the specified size.
            </summary>
            <param name="size">The size.</param>
            <param name="poolItems">The pool items.</param>
            <returns></returns>
        </member>
        <member name="T:SuperSocket.Common.IPoolInfo">
            <summary>
            The pool information class
            </summary>
        </member>
        <member name="P:SuperSocket.Common.IPoolInfo.MinPoolSize">
            <summary>
            Gets the min size of the pool.
            </summary>
            <value>
            The min size of the pool.
            </value>
        </member>
        <member name="P:SuperSocket.Common.IPoolInfo.MaxPoolSize">
            <summary>
            Gets the max size of the pool.
            </summary>
            <value>
            The max size of the pool.
            </value>
        </member>
        <member name="P:SuperSocket.Common.IPoolInfo.AvialableItemsCount">
            <summary>
            Gets the avialable items count.
            </summary>
            <value>
            The avialable items count.
            </value>
        </member>
        <member name="P:SuperSocket.Common.IPoolInfo.TotalItemsCount">
            <summary>
            Gets the total items count, include items in the pool and outside the pool.
            </summary>
            <value>
            The total items count.
            </value>
        </member>
        <member name="T:SuperSocket.Common.ISmartPool`1">
            <summary>
            The basic interface of smart pool
            </summary>
            <typeparam name="T"></typeparam>
        </member>
        <member name="M:SuperSocket.Common.ISmartPool`1.Initialize(System.Int32,System.Int32,SuperSocket.Common.ISmartPoolSourceCreator{`0})">
            <summary>
            Initializes the specified min pool size.
            </summary>
            <param name="minPoolSize">The min size of the pool.</param>
            <param name="maxPoolSize">The max size of the pool.</param>
            <param name="sourceCreator">The source creator.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.ISmartPool`1.Push(`0)">
            <summary>
            Pushes the specified item into the pool.
            </summary>
            <param name="item">The item.</param>
        </member>
        <member name="M:SuperSocket.Common.ISmartPool`1.TryGet(`0@)">
            <summary>
            Tries to get one item from the pool.
            </summary>
            <param name="item">The item.</param>
            <returns></returns>
        </member>
        <member name="T:SuperSocket.Common.ISmartPoolSource">
            <summary>
            ISmartPoolSource
            </summary>
        </member>
        <member name="P:SuperSocket.Common.ISmartPoolSource.Count">
            <summary>
            Gets the count.
            </summary>
            <value>
            The count.
            </value>
        </member>
        <member name="T:SuperSocket.Common.SmartPoolSource">
            <summary>
            SmartPoolSource
            </summary>
        </member>
        <member name="M:SuperSocket.Common.SmartPoolSource.#ctor(System.Object,System.Int32)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Common.SmartPoolSource"/> class.
            </summary>
            <param name="source">The source.</param>
            <param name="itemsCount">The items count.</param>
        </member>
        <member name="P:SuperSocket.Common.SmartPoolSource.Source">
            <summary>
            Gets the source.
            </summary>
            <value>
            The source.
            </value>
        </member>
        <member name="P:SuperSocket.Common.SmartPoolSource.Count">
            <summary>
            Gets the count.
            </summary>
            <value>
            The count.
            </value>
        </member>
        <member name="T:SuperSocket.Common.SmartPool`1">
            <summary>
            The smart pool
            </summary>
            <typeparam name="T"></typeparam>
        </member>
        <member name="M:SuperSocket.Common.SmartPool`1.Initialize(System.Int32,System.Int32,SuperSocket.Common.ISmartPoolSourceCreator{`0})">
            <summary>
            Initializes the specified min and max pool size.
            </summary>
            <param name="minPoolSize">The min size of the pool.</param>
            <param name="maxPoolSize">The max size of the pool.</param>
            <param name="sourceCreator">The source creator.</param>
        </member>
        <member name="M:SuperSocket.Common.SmartPool`1.Push(`0)">
            <summary>
            Pushes the specified item into the pool.
            </summary>
            <param name="item">The item.</param>
        </member>
        <member name="M:SuperSocket.Common.SmartPool`1.TryGet(`0@)">
            <summary>
            Tries to get one item from the pool.
            </summary>
            <param name="item">The item.</param>
            <returns></returns>
            <exception cref="T:System.NotImplementedException"></exception>
        </member>
        <member name="P:SuperSocket.Common.SmartPool`1.MinPoolSize">
            <summary>
            Gets the size of the min pool.
            </summary>
            <value>
            The size of the min pool.
            </value>
        </member>
        <member name="P:SuperSocket.Common.SmartPool`1.MaxPoolSize">
            <summary>
            Gets the size of the max pool.
            </summary>
            <value>
            The size of the max pool.
            </value>
        </member>
        <member name="P:SuperSocket.Common.SmartPool`1.AvialableItemsCount">
            <summary>
            Gets the avialable items count.
            </summary>
            <value>
            The avialable items count.
            </value>
        </member>
        <member name="P:SuperSocket.Common.SmartPool`1.TotalItemsCount">
            <summary>
            Gets the total items count, include items in the pool and outside the pool.
            </summary>
            <value>
            The total items count.
            </value>
        </member>
        <member name="T:SuperSocket.Common.SocketEx">
            <summary>
            Socket extension class
            </summary>
        </member>
        <member name="M:SuperSocket.Common.SocketEx.SafeClose(System.Net.Sockets.Socket)">
            <summary>
            Close the socket safely.
            </summary>
            <param name="socket">The socket.</param>
        </member>
        <member name="M:SuperSocket.Common.SocketEx.SendData(System.Net.Sockets.Socket,System.Byte[])">
            <summary>
            Sends the data.
            </summary>
            <param name="client">The client.</param>
            <param name="data">The data.</param>
        </member>
        <member name="M:SuperSocket.Common.SocketEx.SendData(System.Net.Sockets.Socket,System.Byte[],System.Int32,System.Int32)">
            <summary>
            Sends the data.
            </summary>
            <param name="client">The client.</param>
            <param name="data">The data.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
        </member>
        <member name="T:SuperSocket.Common.StringExtension">
            <summary>
            String extension class
            </summary>
            <summary>
            String extension
            </summary>
        </member>
        <member name="M:SuperSocket.Common.StringExtension.ToInt32(System.String)">
            <summary>
            Convert string to int32.
            </summary>
            <param name="source">The source.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.StringExtension.ToInt32(System.String,System.Int32)">
            <summary>
            Convert string to int32.
            </summary>
            <param name="source">The source.</param>
            <param name="defaultValue">The default value.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.StringExtension.ToLong(System.String)">
            <summary>
            Convert string to long.
            </summary>
            <param name="source">The source.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.StringExtension.ToLong(System.String,System.Int64)">
            <summary>
            Convert string to long.
            </summary>
            <param name="source">The source.</param>
            <param name="defaultValue">The default value.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.StringExtension.ToShort(System.String)">
            <summary>
            Convert string to short.
            </summary>
            <param name="source">The source.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.StringExtension.ToShort(System.String,System.Int16)">
            <summary>
            Convert string to short.
            </summary>
            <param name="source">The source.</param>
            <param name="defaultValue">The default value.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.StringExtension.ToDecimal(System.String)">
            <summary>
            Convert string to decimal.
            </summary>
            <param name="source">The source.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.StringExtension.ToDecimal(System.String,System.Decimal)">
            <summary>
            Convert string to decimal.
            </summary>
            <param name="source">The source.</param>
            <param name="defaultValue">The default value.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.StringExtension.ToDateTime(System.String)">
            <summary>
            Convert string to date time.
            </summary>
            <param name="source">The source.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.StringExtension.ToDateTime(System.String,System.DateTime)">
            <summary>
            Convert string to date time.
            </summary>
            <param name="source">The source.</param>
            <param name="defaultValue">The default value.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.StringExtension.ToBoolean(System.String)">
            <summary>
            Convert string to boolean.
            </summary>
            <param name="source">The source.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.StringExtension.ToBoolean(System.String,System.Boolean)">
            <summary>
            Convert string tp boolean.
            </summary>
            <param name="source">The source.</param>
            <param name="defaultValue">if set to <c>true</c> [default value].</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Common.StringExtension.TryParseEnum``1(System.String,System.Boolean,``0@)">
            <summary>
            Tries parse string to enum.
            </summary>
            <typeparam name="T">the enum type</typeparam>
            <param name="value">The value.</param>
            <param name="ignoreCase">if set to <c>true</c> [ignore case].</param>
            <param name="enumValue">The enum value.</param>
            <returns></returns>
        </member>
        <member name="T:SuperSocket.Common.TheadPoolEx">
            <summary>
            Thread pool extension class
            </summary>
        </member>
        <member name="M:SuperSocket.Common.TheadPoolEx.ResetThreadPool(System.Nullable{System.Int32},System.Nullable{System.Int32},System.Nullable{System.Int32},System.Nullable{System.Int32})">
            <summary>
            Resets the thread pool.
            </summary>
            <param name="maxWorkingThreads">The max working threads.</param>
            <param name="maxCompletionPortThreads">The max completion port threads.</param>
            <param name="minWorkingThreads">The min working threads.</param>
            <param name="minCompletionPortThreads">The min completion port threads.</param>
            <returns></returns>
        </member>
    </members>
</doc>
lib/SuperSocket.Common.dll
Binary files differ
lib/SuperSocket.Facility.XML
New file
@@ -0,0 +1,601 @@
<?xml version="1.0"?>
<doc>
    <assembly>
        <name>SuperSocket.Facility</name>
    </assembly>
    <members>
        <member name="T:SuperSocket.Facility.PolicyServer.FlashPolicyServer">
            <summary>
            Flash policy AppServer
            </summary>
        </member>
        <member name="T:SuperSocket.Facility.PolicyServer.PolicyServer">
            <summary>
            PolicyServer base class
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.PolicyServer.PolicyServer.#ctor">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.PolicyServer.PolicyServer"/> class.
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.PolicyServer.PolicyServer.Setup(SuperSocket.SocketBase.Config.IRootConfig,SuperSocket.SocketBase.Config.IServerConfig)">
            <summary>
            Setups the specified root config.
            </summary>
            <param name="rootConfig">The root config.</param>
            <param name="config">The config.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.PolicyServer.PolicyServer.SetupPolicyResponse(System.Byte[])">
            <summary>
            Setups the policy response.
            </summary>
            <param name="policyFileData">The policy file data.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.PolicyServer.PolicyServer.GetPolicyFileResponse(System.Net.IPEndPoint)">
            <summary>
            Gets the policy file response.
            </summary>
            <param name="clientEndPoint">The client end point.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.PolicyServer.PolicyServer.ProcessRequest(SuperSocket.Facility.PolicyServer.PolicySession,System.Byte[])">
            <summary>
            Processes the request.
            </summary>
            <param name="session">The session.</param>
            <param name="data">The data.</param>
        </member>
        <member name="P:SuperSocket.Facility.PolicyServer.PolicyServer.PolicyResponse">
            <summary>
            Gets the policy response.
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.PolicyServer.FlashPolicyServer.#ctor">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.PolicyServer.FlashPolicyServer"/> class.
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.PolicyServer.FlashPolicyServer.SetupPolicyResponse(System.Byte[])">
            <summary>
            Setups the policy response.
            </summary>
            <param name="policyFileData">The policy file data.</param>
            <returns></returns>
        </member>
        <member name="T:SuperSocket.Facility.PolicyServer.PolicyReceiveFilter">
            <summary>
            PolicyReceiveFilter
            </summary>
        </member>
        <member name="T:SuperSocket.Facility.Protocol.FixedSizeReceiveFilter`1">
            <summary>
            FixedSizeReceiveFilter
            </summary>
            <typeparam name="TRequestInfo">The type of the request info.</typeparam>
        </member>
        <member name="F:SuperSocket.Facility.Protocol.FixedSizeReceiveFilter`1.NullRequestInfo">
            <summary>
            Null RequestInfo
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.FixedSizeReceiveFilter`1.#ctor(System.Int32)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.Protocol.FixedSizeReceiveFilter`1"/> class.
            </summary>
            <param name="size">The size.</param>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.FixedSizeReceiveFilter`1.Filter(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Int32@)">
            <summary>
            Filters the specified session.
            </summary>
            <param name="readBuffer">The read buffer.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
            <param name="rest">The rest.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.FixedSizeReceiveFilter`1.ProcessMatchedRequest(System.Byte[],System.Int32,System.Int32,System.Boolean)">
            <summary>
            Filters the buffer after the server receive the enough size of data.
            </summary>
            <param name="buffer">The buffer.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.FixedSizeReceiveFilter`1.Reset">
            <summary>
            Resets this instance.
            </summary>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.FixedSizeReceiveFilter`1.Size">
            <summary>
            Gets the size of the fixed size Receive filter.
            </summary>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.FixedSizeReceiveFilter`1.LeftBufferSize">
            <summary>
            Gets the size of the rest buffer.
            </summary>
            <value>
            The size of the rest buffer.
            </value>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.FixedSizeReceiveFilter`1.NextReceiveFilter">
            <summary>
            Gets the next Receive filter.
            </summary>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.FixedSizeReceiveFilter`1.SuperSocket#SocketBase#Protocol#IOffsetAdapter#OffsetDelta">
            <summary>
            Gets the offset delta.
            </summary>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.FixedSizeReceiveFilter`1.State">
            <summary>
            Gets the filter state.
            </summary>
            <value>
            The filter state.
            </value>
        </member>
        <member name="M:SuperSocket.Facility.PolicyServer.PolicyReceiveFilter.#ctor(System.Int32)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.PolicyServer.PolicyReceiveFilter"/> class.
            </summary>
            <param name="size">The size.</param>
        </member>
        <member name="M:SuperSocket.Facility.PolicyServer.PolicyReceiveFilter.ProcessMatchedRequest(System.Byte[],System.Int32,System.Int32,System.Boolean)">
            <summary>
            Filters the buffer after the server receive the enough size of data.
            </summary>
            <param name="buffer">The buffer.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.PolicyServer.PolicyReceiveFilterFactory.#ctor(System.Int32)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.PolicyServer.PolicyReceiveFilterFactory"/> class.
            </summary>
            <param name="fixRequestSize">Size of the fix request.</param>
        </member>
        <member name="M:SuperSocket.Facility.PolicyServer.PolicyReceiveFilterFactory.CreateFilter(SuperSocket.SocketBase.IAppServer,SuperSocket.SocketBase.IAppSession,System.Net.IPEndPoint)">
            <summary>
            Creates the filter.
            </summary>
            <param name="appServer">The app server.</param>
            <param name="appSession">The app session.</param>
            <param name="remoteEndPoint">The remote end point.</param>
            <returns></returns>
        </member>
        <member name="P:SuperSocket.Facility.PolicyServer.PolicyReceiveFilterFactory.FixRequestSize">
            <summary>
            Gets the size of the fix request.
            </summary>
            <value>
            The size of the fix request.
            </value>
        </member>
        <member name="T:SuperSocket.Facility.PolicyServer.PolicySession">
            <summary>
            PolicySession
            </summary>
        </member>
        <member name="T:SuperSocket.Facility.PolicyServer.SilverlightPolicyServer">
            <summary>
            Silverlight policy AppServer
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.PolicyServer.SilverlightPolicyServer.#ctor">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.PolicyServer.SilverlightPolicyServer"/> class.
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.PolicyServer.SilverlightPolicyServer.ProcessRequest(SuperSocket.Facility.PolicyServer.PolicySession,System.Byte[])">
            <summary>
            Processes the request.
            </summary>
            <param name="session">The session.</param>
            <param name="data">The data.</param>
        </member>
        <member name="T:SuperSocket.Facility.Protocol.BeginEndMarkReceiveFilter`1">
            <summary>
            ReceiveFilter for the protocol that each request has bengin and end mark
            </summary>
            <typeparam name="TRequestInfo">The type of the request info.</typeparam>
        </member>
        <member name="F:SuperSocket.Facility.Protocol.BeginEndMarkReceiveFilter`1.NullRequestInfo">
            <summary>
            Null request info
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.BeginEndMarkReceiveFilter`1.#ctor(System.Byte[],System.Byte[])">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.Protocol.BeginEndMarkReceiveFilter`1"/> class.
            </summary>
            <param name="beginMark">The begin mark.</param>
            <param name="endMark">The end mark.</param>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.BeginEndMarkReceiveFilter`1.Filter(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Int32@)">
            <summary>
            Filters the specified session.
            </summary>
            <param name="readBuffer">The read buffer.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
            <param name="rest">The rest.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.BeginEndMarkReceiveFilter`1.ProcessMatchedRequest(System.Byte[],System.Int32,System.Int32)">
            <summary>
            Processes the matched request.
            </summary>
            <param name="readBuffer">The read buffer.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.BeginEndMarkReceiveFilter`1.Reset">
            <summary>
            Resets this instance.
            </summary>
        </member>
        <member name="T:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter`1">
            <summary>
            This Receive filter is designed for this kind protocol:
            each request has fixed count part which splited by a char(byte)
            for instance, request is defined like this "#12122#23343#4545456565#343435446#",
            because this request is splited into many parts by 5 '#', we can create a Receive filter by CountSpliterRequestFilter((byte)'#', 5)
            </summary>
            <typeparam name="TRequestInfo">The type of the request info.</typeparam>
        </member>
        <member name="F:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter`1.NullRequestInfo">
            <summary>
            Null request info instance
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter`1.#ctor(System.Byte,System.Int32)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter`1"/> class.
            </summary>
            <param name="spliter">The spliter.</param>
            <param name="spliterCount">The spliter count.</param>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter`1.Filter(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Int32@)">
            <summary>
            Filters the specified session.
            </summary>
            <param name="readBuffer">The read buffer.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
            <param name="rest">The rest.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter`1.ProcessMatchedRequest(System.Byte[],System.Int32,System.Int32)">
            <summary>
            Processes the matched request.
            </summary>
            <param name="readBuffer">The read buffer.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter`1.Reset">
            <summary>
            Resets this instance.
            </summary>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter`1.LeftBufferSize">
            <summary>
            Gets the size of the rest buffer.
            </summary>
            <value>
            The size of the rest buffer.
            </value>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter`1.NextReceiveFilter">
            <summary>
            Gets the next Receive filter.
            </summary>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter`1.OffsetDelta">
            <summary>
            Gets the offset delta relative original receiving offset which will be used for next round receiving.
            </summary>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter`1.State">
            <summary>
            Gets the filter state.
            </summary>
            <value>
            The filter state.
            </value>
        </member>
        <member name="T:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter">
            <summary>
            This Receive filter is designed for this kind protocol:
            each request has fixed count part which splited by a char(byte)
            for instance, request is defined like this "#12122#23343#4545456565#343435446#",
            because this request is splited into many parts by 5 '#', we can create a Receive filter by CountSpliterRequestFilter((byte)'#', 5)
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter.#ctor(System.Byte,System.Int32)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter"/> class.
            </summary>
            <param name="spliter">The spliter.</param>
            <param name="spliterCount">The spliter count.</param>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter.#ctor(System.Byte,System.Int32,System.Text.Encoding)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter"/> class.
            </summary>
            <param name="spliter">The spliter.</param>
            <param name="spliterCount">The spliter count.</param>
            <param name="encoding">The encoding.</param>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter.#ctor(System.Byte,System.Int32,System.Text.Encoding,System.Int32)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter"/> class.
            </summary>
            <param name="spliter">The spliter.</param>
            <param name="spliterCount">The spliter count.</param>
            <param name="encoding">The encoding.</param>
            <param name="keyIndex">Index of the key.</param>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.CountSpliterReceiveFilter.ProcessMatchedRequest(System.Byte[],System.Int32,System.Int32)">
            <summary>
            Processes the matched request.
            </summary>
            <param name="readBuffer">The read buffer.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <returns></returns>
        </member>
        <member name="T:SuperSocket.Facility.Protocol.CountSpliterReceiveFilterFactory`2">
            <summary>
            ReceiveFilterFactory for CountSpliterReceiveFilter
            </summary>
            <typeparam name="TRequestFilter">The type of the Receive filter.</typeparam>
            <typeparam name="TRequestInfo">The type of the request info.</typeparam>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.CountSpliterReceiveFilterFactory`2.CreateFilter(SuperSocket.SocketBase.IAppServer,SuperSocket.SocketBase.IAppSession,System.Net.IPEndPoint)">
            <summary>
            Creates the filter.
            </summary>
            <param name="appServer">The app server.</param>
            <param name="appSession">The app session.</param>
            <param name="remoteEndPoint">The remote end point.</param>
            <returns></returns>
        </member>
        <member name="T:SuperSocket.Facility.Protocol.CountSpliterReceiveFilterFactory`1">
            <summary>
            ReceiveFilterFactory for CountSpliterReceiveFilter
            </summary>
            <typeparam name="TRequestFilter">The type of the Receive filter.</typeparam>
        </member>
        <member name="T:SuperSocket.Facility.Protocol.CountSpliterReceiveFilterFactory">
            <summary>
            receiveFilterFactory for CountSpliterRequestFilter
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.CountSpliterReceiveFilterFactory.#ctor(System.Byte,System.Int32)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.Protocol.CountSpliterReceiveFilterFactory"/> class.
            </summary>
            <param name="spliter">The spliter.</param>
            <param name="count">The count.</param>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.CountSpliterReceiveFilterFactory.CreateFilter(SuperSocket.SocketBase.IAppServer,SuperSocket.SocketBase.IAppSession,System.Net.IPEndPoint)">
            <summary>
            Creates the filter.
            </summary>
            <param name="appServer">The app server.</param>
            <param name="appSession">The app session.</param>
            <param name="remoteEndPoint">The remote end point.</param>
            <returns></returns>
        </member>
        <member name="T:SuperSocket.Facility.Protocol.FixedHeaderReceiveFilter`1">
            <summary>
            FixedHeaderReceiveFilter,
            it is the Receive filter base for the protocol which define fixed length header and the header contains the request body length,
            you can implement your own Receive filter for this kind protocol easily by inheriting this class
            </summary>
            <typeparam name="TRequestInfo">The type of the request info.</typeparam>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.FixedHeaderReceiveFilter`1.#ctor(System.Int32)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.Protocol.FixedHeaderReceiveFilter`1"/> class.
            </summary>
            <param name="headerSize">Size of the header.</param>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.FixedHeaderReceiveFilter`1.Filter(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Int32@)">
            <summary>
            Filters the specified session.
            </summary>
            <param name="readBuffer">The read buffer.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
            <param name="rest">The rest.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.FixedHeaderReceiveFilter`1.ProcessMatchedRequest(System.Byte[],System.Int32,System.Int32,System.Boolean)">
            <summary>
            Processes the fix size request.
            </summary>
            <param name="buffer">The buffer.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.FixedHeaderReceiveFilter`1.GetBodyLengthFromHeader(System.Byte[],System.Int32,System.Int32)">
            <summary>
            Gets the body length from header.
            </summary>
            <param name="header">The header.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.FixedHeaderReceiveFilter`1.ResolveRequestInfo(System.ArraySegment{System.Byte},System.Byte[],System.Int32,System.Int32)">
            <summary>
            Resolves the request data.
            </summary>
            <param name="header">The header.</param>
            <param name="bodyBuffer">The body buffer.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.FixedHeaderReceiveFilter`1.Reset">
            <summary>
            Resets this instance.
            </summary>
        </member>
        <member name="T:SuperSocket.Facility.Protocol.HttpReceiveFilterBase`1">
            <summary>
            HttpReceiveFilterBase
            </summary>
            <typeparam name="TRequestInfo">The type of the request info.</typeparam>
        </member>
        <member name="F:SuperSocket.Facility.Protocol.HttpReceiveFilterBase`1.NewLine">
            <summary>
            Http header terminator
            </summary>
        </member>
        <member name="F:SuperSocket.Facility.Protocol.HttpReceiveFilterBase`1.m_HeaderParsed">
            <summary>
            indicate whether the header has been parsed
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.HttpReceiveFilterBase`1.#ctor">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.Protocol.HttpReceiveFilterBase`1"/> class.
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.HttpReceiveFilterBase`1.Filter(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Int32@)">
            <summary>
            Filters the specified session.
            </summary>
            <param name="readBuffer">The read buffer.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
            <param name="rest">The rest.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.HttpReceiveFilterBase`1.FilterRequestBody(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Int32@)">
            <summary>
            Filters the request body.
            </summary>
            <param name="readBuffer">The read buffer.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
            <param name="rest">The rest data size.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.HttpReceiveFilterBase`1.ProcessMatchedRequest(System.Byte[],System.Int32,System.Int32)">
            <summary>
            Resolves the specified data.
            </summary>
            <param name="data">The data.</param>
            <param name="offset">The offset.</param>
            <param name="length">The length.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.HttpReceiveFilterBase`1.FilterRequestHeader(System.Collections.Specialized.NameValueCollection)">
            <summary>
            Filters the request header.
            </summary>
            <param name="header">The header.</param>
            <returns>
            return the parsed request info from header; if the request has body, this method should return null
            </returns>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.HttpReceiveFilterBase`1.Reset">
            <summary>
            Resets this instance to inital state.
            </summary>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.HttpReceiveFilterBase`1.HeaderItems">
            <summary>
            Gets the header items.
            </summary>
        </member>
        <member name="T:SuperSocket.Facility.Protocol.IHttpRequestInfo">
            <summary>
            IHttpRequestInfo
            </summary>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.IHttpRequestInfo.Header">
            <summary>
            Gets the http header.
            </summary>
        </member>
        <member name="T:SuperSocket.Facility.Protocol.HttpRequestInfoBase">
            <summary>
            HttpRequestInfoBase
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.HttpRequestInfoBase.#ctor(System.String,System.Collections.Specialized.NameValueCollection)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.Protocol.HttpRequestInfoBase"/> class.
            </summary>
            <param name="key">The key.</param>
            <param name="header">The header.</param>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.HttpRequestInfoBase.Key">
            <summary>
            Gets the key of this request.
            </summary>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.HttpRequestInfoBase.Header">
            <summary>
            Gets the http header.
            </summary>
        </member>
        <member name="T:SuperSocket.Facility.Protocol.HttpRequestInfoBase`1">
            <summary>
            HttpRequestInfoBase
            </summary>
            <typeparam name="TRequestBody">The type of the request body.</typeparam>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.HttpRequestInfoBase`1.#ctor(System.String,System.Collections.Specialized.NameValueCollection,`0)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.Facility.Protocol.HttpRequestInfoBase`1"/> class.
            </summary>
            <param name="key">The key.</param>
            <param name="header">The header.</param>
            <param name="body">The body.</param>
        </member>
        <member name="P:SuperSocket.Facility.Protocol.HttpRequestInfoBase`1.Body">
            <summary>
            Gets the body.
            </summary>
        </member>
        <member name="T:SuperSocket.Facility.Protocol.MimeHeaderHelper">
            <summary>
            MimeHeader Helper class
            </summary>
        </member>
        <member name="M:SuperSocket.Facility.Protocol.MimeHeaderHelper.ParseHttpHeader(System.String,System.Collections.Specialized.NameValueCollection)">
            <summary>
            Parses the HTTP header.
            </summary>
            <param name="headerData">The header data.</param>
            <param name="header">The header.</param>
        </member>
    </members>
</doc>
lib/SuperSocket.Facility.dll
Binary files differ
lib/SuperSocket.SocketBase.XML
New file
Diff too large
lib/SuperSocket.SocketBase.dll
Binary files differ
lib/SuperSocket.SocketEngine.XML
New file
@@ -0,0 +1,1291 @@
<?xml version="1.0"?>
<doc>
    <assembly>
        <name>SuperSocket.SocketEngine</name>
    </assembly>
    <members>
        <member name="T:SuperSocket.SocketEngine.AppDomainAppServer">
            <summary>
            AppDomainAppServer
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.IsolationAppServer.InitializeLifetimeService">
            <summary>
            Obtains a lifetime service object to control the lifetime policy for this instance.
            Return null, never expired
            </summary>
            <returns>
            An object of type <see cref="T:System.Runtime.Remoting.Lifetime.ILease" /> used to control the lifetime policy for this instance. This is the current lifetime service object for this instance if one exists; otherwise, a new lifetime service object initialized to the value of the <see cref="P:System.Runtime.Remoting.Lifetime.LifetimeServices.LeaseManagerPollTime" /> property.
            </returns>
            <PermissionSet>
              <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="RemotingConfiguration, Infrastructure" />
              </PermissionSet>
        </member>
        <member name="P:SuperSocket.SocketEngine.IsolationAppServer.StatusMetadataExtended">
            <summary>
            Gets a value indicating whether [status metadata extended].
            </summary>
            <value>
            <c>true</c> if [status metadata extended]; otherwise, <c>false</c>.
            </value>
        </member>
        <member name="M:SuperSocket.SocketEngine.AppDomainAppServer.#ctor(System.String,SuperSocket.SocketBase.Metadata.StatusInfoAttribute[])">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.SocketEngine.AppDomainAppServer"/> class.
            </summary>
            <param name="serverTypeName">Name of the server type.</param>
            <param name="serverStatusMetadata">The server status metadata.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.AppDomainAppServer.Start">
            <summary>
            Starts this server instance.
            </summary>
            <returns>
            return true if start successfull, else false
            </returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.WorkItemFactoryInfoLoader.ValidateProviderType(System.String)">
            <summary>
            Validates the type of the provider, needn't validate in default mode, because it will be validate later when initializing.
            </summary>
            <param name="typeName">Name of the type.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.WorkItemFactoryInfoLoader.GetServerTypeMetadata(System.String)">
            <summary>
            Gets the app server type's metadata, the return value is not required in this mode.
            </summary>
            <param name="typeName">Name of the type.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.WorkItemFactoryInfoLoader.Dispose">
            <summary>
            Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
            </summary>
        </member>
        <member name="T:SuperSocket.SocketEngine.DefaultBootstrap">
            <summary>
            SuperSocket default bootstrap
            </summary>
        </member>
        <member name="F:SuperSocket.SocketEngine.DefaultBootstrap.m_Initialized">
            <summary>
            Indicates whether the bootstrap is initialized
            </summary>
        </member>
        <member name="F:SuperSocket.SocketEngine.DefaultBootstrap.m_Config">
            <summary>
            Global configuration
            </summary>
        </member>
        <member name="F:SuperSocket.SocketEngine.DefaultBootstrap.m_GlobalLog">
            <summary>
            Global log
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.#ctor(System.Collections.Generic.IEnumerable{SuperSocket.SocketBase.IWorkItem})">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.SocketEngine.DefaultBootstrap"/> class.
            </summary>
            <param name="appServers">The app servers.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.#ctor(SuperSocket.SocketBase.Config.IRootConfig,System.Collections.Generic.IEnumerable{SuperSocket.SocketBase.IWorkItem})">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.SocketEngine.DefaultBootstrap"/> class.
            </summary>
            <param name="rootConfig">The root config.</param>
            <param name="appServers">The app servers.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.#ctor(SuperSocket.SocketBase.Config.IRootConfig,System.Collections.Generic.IEnumerable{SuperSocket.SocketBase.IWorkItem},SuperSocket.SocketBase.Logging.ILogFactory)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.SocketEngine.DefaultBootstrap"/> class.
            </summary>
            <param name="rootConfig">The root config.</param>
            <param name="appServers">The app servers.</param>
            <param name="logFactory">The log factory.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.#ctor(SuperSocket.SocketBase.Config.IConfigurationSource)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.SocketEngine.DefaultBootstrap"/> class.
            </summary>
            <param name="config">The config.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.#ctor(SuperSocket.SocketBase.Config.IConfigurationSource,System.String)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.SocketEngine.DefaultBootstrap"/> class.
            </summary>
            <param name="config">The config.</param>
            <param name="startupConfigFile">The startup config file.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.CreateWorkItemInstance(System.String,SuperSocket.SocketBase.Metadata.StatusInfoAttribute[])">
            <summary>
            Creates the work item instance.
            </summary>
            <param name="serviceTypeName">Name of the service type.</param>
            <param name="serverStatusMetadata">The server status metadata.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.GetWorkItemFactoryInfoLoader(SuperSocket.SocketBase.Config.IConfigurationSource,SuperSocket.SocketBase.Logging.ILogFactory)">
            <summary>
            Gets the work item factory info loader.
            </summary>
            <param name="config">The config.</param>
            <param name="logFactory">The log factory.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.Initialize(System.Collections.Generic.IDictionary{System.String,System.Net.IPEndPoint})">
            <summary>
            Initializes the bootstrap with a listen endpoint replacement dictionary
            </summary>
            <param name="listenEndPointReplacement">The listen end point replacement.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.Initialize(System.Func{SuperSocket.SocketBase.Config.IServerConfig,SuperSocket.SocketBase.Config.IServerConfig},SuperSocket.SocketBase.Logging.ILogFactory)">
            <summary>
            Initializes the bootstrap with the configuration, config resolver and log factory.
            </summary>
            <param name="serverConfigResolver">The server config resolver.</param>
            <param name="logFactory">The log factory.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.Initialize(System.Func{SuperSocket.SocketBase.Config.IServerConfig,SuperSocket.SocketBase.Config.IServerConfig})">
            <summary>
            Initializes the bootstrap with the configuration and config resolver.
            </summary>
            <param name="serverConfigResolver">The server config resolver.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.Initialize(SuperSocket.SocketBase.Logging.ILogFactory)">
            <summary>
            Initializes the bootstrap with the configuration
            </summary>
            <param name="logFactory">The log factory.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.Initialize">
            <summary>
            Initializes the bootstrap with the configuration
            </summary>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.Start">
            <summary>
            Starts this bootstrap.
            </summary>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.Stop">
            <summary>
            Stops this bootstrap.
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.RegisterRemotingService">
            <summary>
            Registers the bootstrap remoting access service.
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.Dispose(System.Boolean)">
            <summary>
            Releases unmanaged and - optionally - managed resources.
            </summary>
            <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.DefaultBootstrap.Dispose">
            <summary>
            Releases unmanaged and - optionally - managed resources.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.DefaultBootstrap.SuperSocket#SocketBase#ILoggerProvider#Logger">
            <summary>
            Gets the bootstrap logger.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.DefaultBootstrap.LogFactory">
            <summary>
            Gets the log factory.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.DefaultBootstrap.AppServers">
            <summary>
            Gets all the app servers running in this bootstrap
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.DefaultBootstrap.Config">
            <summary>
            Gets the config.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.DefaultBootstrap.StartupConfigFile">
            <summary>
            Gets the startup config file.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.DefaultBootstrap.PerfMonitor">
            <summary>
            Gets the <see cref="T:SuperSocket.SocketEngine.PerformanceMonitor"/> class.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.DefaultBootstrap.BaseDirectory">
            <summary>
            Gets the base directory.
            </summary>
            <value>
            The base directory.
            </value>
        </member>
        <member name="T:SuperSocket.SocketEngine.AppDomainBootstrap">
            <summary>
            AppDomainBootstrap
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.AppDomainBootstrap.#ctor(SuperSocket.SocketBase.Config.IConfigurationSource)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.SocketEngine.AppDomainBootstrap"/> class.
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.AppDomainBootstrap.Initialize">
            <summary>
            Initializes the bootstrap with the configuration
            </summary>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.AppDomainBootstrap.Initialize(System.Func{SuperSocket.SocketBase.Config.IServerConfig,SuperSocket.SocketBase.Config.IServerConfig})">
            <summary>
            Initializes the bootstrap with the configuration and config resolver.
            </summary>
            <param name="serverConfigResolver">The server config resolver.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.AppDomainBootstrap.Initialize(SuperSocket.SocketBase.Logging.ILogFactory)">
            <summary>
            Initializes the bootstrap with the configuration and config resolver.
            </summary>
            <param name="logFactory">The log factory.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.AppDomainBootstrap.Initialize(System.Collections.Generic.IDictionary{System.String,System.Net.IPEndPoint})">
            <summary>
            Initializes the bootstrap with a listen endpoint replacement dictionary
            </summary>
            <param name="listenEndPointReplacement">The listen end point replacement.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.AppDomainBootstrap.Initialize(System.Func{SuperSocket.SocketBase.Config.IServerConfig,SuperSocket.SocketBase.Config.IServerConfig},SuperSocket.SocketBase.Logging.ILogFactory)">
            <summary>
            Initializes the bootstrap with the configuration
            </summary>
            <param name="serverConfigResolver">The server config resolver.</param>
            <param name="logFactory">The log factory.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.AppDomainBootstrap.Start">
            <summary>
            Starts this bootstrap.
            </summary>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.AppDomainBootstrap.Stop">
            <summary>
            Stops this bootstrap.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.AppDomainBootstrap.AppServers">
            <summary>
            Gets all the app servers running in this bootstrap
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.AppDomainBootstrap.Config">
            <summary>
            Gets the config.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.AppDomainBootstrap.SuperSocket#SocketBase#ILoggerProvider#Logger">
            <summary>
            Gets the bootstrap logger.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.AppDomainBootstrap.StartupConfigFile">
            <summary>
            Gets the startup config file.
            </summary>
        </member>
        <member name="T:SuperSocket.SocketEngine.AssemblyImport">
            <summary>
            AssemblyImport, used for importing assembly to the current AppDomain
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.AssemblyImport.#ctor(System.String)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.SocketEngine.AssemblyImport"/> class.
            </summary>
        </member>
        <member name="T:SuperSocket.SocketEngine.BootstrapFactory">
            <summary>
            Bootstrap Factory
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.BootstrapFactory.CreateBootstrap(SuperSocket.SocketBase.Config.IConfigurationSource)">
            <summary>
            Creates the bootstrap.
            </summary>
            <param name="config">The config.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.BootstrapFactory.CreateBootstrap">
            <summary>
            Creates the bootstrap from app configuration's socketServer section.
            </summary>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.BootstrapFactory.CreateBootstrap(System.String)">
            <summary>
            Creates the bootstrap.
            </summary>
            <param name="configSectionName">Name of the config section.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.BootstrapFactory.CreateBootstrapFromConfigFile(System.String)">
            <summary>
            Creates the bootstrap from configuration file.
            </summary>
            <param name="configFile">The configuration file.</param>
            <returns></returns>
        </member>
        <member name="T:SuperSocket.SocketEngine.ConfigurationWatcher">
            <summary>
            The configuration file watcher, it is used for hot configuration updating
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.ConfigurationWatcher.Watch(System.Configuration.ConfigurationSection,SuperSocket.SocketBase.IBootstrap)">
            <summary>
            Watches the specified configuration section.
            </summary>
            <param name="configSection">The configuration section.</param>
            <param name="bootstrap">The bootstrap.</param>
        </member>
        <member name="T:SuperSocket.SocketEngine.Configuration.CommandAssembly">
            <summary>
            Command assembly configuration element
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.CommandAssembly.Assembly">
            <summary>
            Gets the assembly name.
            </summary>
            <value>
            The assembly.
            </value>
        </member>
        <member name="T:SuperSocket.SocketEngine.Configuration.CommandAssemblyCollection">
            <summary>
            Command assembly configuation collection
            </summary>
        </member>
        <member name="T:SuperSocket.SocketEngine.Configuration.Server">
            <summary>
            Server, the port which is compatible with .Net 4.5 or higher
            </summary>
            <summary>
            Server configuration
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.Configuration.Server.GetChildConfig``1(System.String)">
            <summary>
            Gets the child config.
            </summary>
            <typeparam name="TConfig">The type of the config.</typeparam>
            <param name="childConfigName">Name of the child config.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.Configuration.Server.OnDeserializeUnrecognizedAttribute(System.String,System.String)">
            <summary>
            Gets a value indicating whether an unknown attribute is encountered during deserialization.
            To keep compatible with old configuration
            </summary>
            <param name="name">The name of the unrecognized attribute.</param>
            <param name="value">The value of the unrecognized attribute.</param>
            <returns>
            true when an unknown attribute is encountered while deserializing; otherwise, false.
            </returns>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.DefaultCulture">
            <summary>
            Gets/sets the default culture for this server.
            </summary>
            <value>
            The default culture.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ServerTypeName">
            <summary>
            Gets the name of the server type this appServer want to use.
            </summary>
            <value>
            The name of the server type.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ServerType">
            <summary>
            Gets the type definition of the appserver.
            </summary>
            <value>
            The type of the server.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ReceiveFilterFactory">
            <summary>
            Gets the Receive filter factory.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Ip">
            <summary>
            Gets the ip.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Port">
            <summary>
            Gets the port.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Mode">
            <summary>
            Gets the mode.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Disabled">
            <summary>
            Gets a value indicating whether this <see cref="T:SuperSocket.SocketBase.Config.IServerConfig"/> is disabled.
            </summary>
            <value>
              <c>true</c> if disabled; otherwise, <c>false</c>.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SendTimeOut">
            <summary>
            Gets the send time out.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.MaxConnectionNumber">
            <summary>
            Gets the max connection number.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ReceiveBufferSize">
            <summary>
            Gets the size of the receive buffer.
            </summary>
            <value>
            The size of the receive buffer.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SendBufferSize">
            <summary>
            Gets the size of the send buffer.
            </summary>
            <value>
            The size of the send buffer.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SyncSend">
            <summary>
            Gets a value indicating whether sending is in synchronous mode.
            </summary>
            <value>
              <c>true</c> if [sync send]; otherwise, <c>false</c>.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.LogCommand">
            <summary>
            Gets a value indicating whether log command in log file.
            </summary>
            <value><c>true</c> if log command; otherwise, <c>false</c>.</value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.LogBasicSessionActivity">
            <summary>
            Gets a value indicating whether [log basic session activity like connected and disconnected].
            </summary>
            <value>
                <c>true</c> if [log basic session activity]; otherwise, <c>false</c>.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.LogAllSocketException">
            <summary>
            Gets a value indicating whether [log all socket exception].
            </summary>
            <value>
            <c>true</c> if [log all socket exception]; otherwise, <c>false</c>.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ClearIdleSession">
            <summary>
            Gets a value indicating whether clear idle session.
            </summary>
            <value><c>true</c> if clear idle session; otherwise, <c>false</c>.</value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ClearIdleSessionInterval">
            <summary>
            Gets the clear idle session interval, in seconds.
            </summary>
            <value>The clear idle session interval.</value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.IdleSessionTimeOut">
            <summary>
            Gets the idle session timeout time length, in seconds.
            </summary>
            <value>The idle session time out.</value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.CertificateConfig">
            <summary>
            Gets the certificate config.
            </summary>
            <value>The certificate config.</value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Certificate">
            <summary>
            Gets X509Certificate configuration.
            </summary>
            <value>
            X509Certificate configuration.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Security">
            <summary>
            Gets the security protocol, X509 certificate.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.MaxRequestLength">
            <summary>
            Gets the max allowed length of request.
            </summary>
            <value>
            The max allowed length of request.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.DisableSessionSnapshot">
            <summary>
            Gets a value indicating whether [disable session snapshot]
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SessionSnapshotInterval">
            <summary>
            Gets the interval to taking snapshot for all live sessions.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ConnectionFilter">
            <summary>
            Gets the connection filters used by this server instance.
            </summary>
            <value>
            The connection filters's name list, seperated by comma
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.CommandLoader">
            <summary>
            Gets the command loader, multiple values should be separated by comma.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.KeepAliveTime">
            <summary>
            Gets the start keep alive time, in seconds
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.KeepAliveInterval">
            <summary>
            Gets the keep alive interval, in seconds.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.ListenBacklog">
            <summary>
            Gets the backlog size of socket listening.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.StartupOrder">
            <summary>
            Gets the startup order of the server instance.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SendingQueueSize">
            <summary>
            Gets/sets the size of the sending queue.
            </summary>
            <value>
            The size of the sending queue.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.LogFactory">
            <summary>
            Gets the logfactory name of the server instance.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.TextEncoding">
            <summary>
            Gets the default text encoding.
            </summary>
            <value>
            The text encoding.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.Listeners">
            <summary>
            Gets the listeners' configuration.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.SuperSocket#SocketBase#Config#IServerConfig#Listeners">
            <summary>
            Gets the listeners' configuration.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Server.CommandAssemblies">
            <summary>
            Gets the command assemblies configuration.
            </summary>
            <value>
            The command assemblies.
            </value>
        </member>
        <member name="T:SuperSocket.SocketEngine.Configuration.SocketServiceConfig">
            <summary>
            SocketServiceConfig, the part which is compatible with .Net 4.5 or higher
            </summary>
            <summary>
            SuperSocket's root configuration node
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.OnDeserializeUnrecognizedElement(System.String,System.Xml.XmlReader)">
            <summary>
            Gets a value indicating whether an unknown element is encountered during deserialization.
            To keep compatible with old configuration
            </summary>
            <param name="elementName">The name of the unknown subelement.</param>
            <param name="reader">The <see cref="T:System.Xml.XmlReader"/> being used for deserialization.</param>
            <returns>
            true when an unknown element is encountered while deserializing; otherwise, false.
            </returns>
            <exception cref="T:System.Configuration.ConfigurationErrorsException">The element identified by <paramref name="elementName"/> is locked.- or -One or more of the element's attributes is locked.- or -<paramref name="elementName"/> is unrecognized, or the element has an unrecognized attribute.- or -The element has a Boolean attribute with an invalid value.- or -An attempt was made to deserialize a property more than once.- or -An attempt was made to deserialize a property that is not a valid member of the element.- or -The element cannot contain a CDATA or text element.</exception>
        </member>
        <member name="M:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.OnDeserializeUnrecognizedAttribute(System.String,System.String)">
            <summary>
            Gets a value indicating whether an unknown attribute is encountered during deserialization.
            </summary>
            <param name="name">The name of the unrecognized attribute.</param>
            <param name="value">The value of the unrecognized attribute.</param>
            <returns>
            true when an unknown attribute is encountered while deserializing; otherwise, false.
            </returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.GetChildConfig``1(System.String)">
            <summary>
            Gets the child config.
            </summary>
            <typeparam name="TConfig">The type of the config.</typeparam>
            <param name="childConfigName">Name of the child config.</param>
            <returns></returns>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.DefaultCulture">
            <summary>
            Gets/sets the default culture for all server instances.
            </summary>
            <value>
            The default culture.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.Servers">
            <summary>
            Gets all the server configurations
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.ServerTypes">
            <summary>
            Gets the service configurations
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.ConnectionFilters">
            <summary>
            Gets all the connection filter configurations.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.LogFactories">
            <summary>
            Gets the defined log factory types.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.ReceiveFilterFactories">
            <summary>
            Gets the logfactory name of the bootstrap.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.CommandLoaders">
            <summary>
            Gets the command loaders definition.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.MaxWorkingThreads">
            <summary>
            Gets the max working threads.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.MinWorkingThreads">
            <summary>
            Gets the min working threads.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.MaxCompletionPortThreads">
            <summary>
            Gets the max completion port threads.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.MinCompletionPortThreads">
            <summary>
            Gets the min completion port threads.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.PerformanceDataCollectInterval">
            <summary>
            Gets the performance data collect interval, in seconds.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.DisablePerformanceDataCollector">
            <summary>
            Gets a value indicating whether [disable performance data collector].
            </summary>
            <value>
                <c>true</c> if [disable performance data collector]; otherwise, <c>false</c>.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.Isolation">
            <summary>
            Gets the isolation mode.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.LogFactory">
            <summary>
            Gets the logfactory name of the bootstrap.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.SocketServiceConfig.OptionElements">
            <summary>
            Gets the option elements.
            </summary>
        </member>
        <member name="T:SuperSocket.SocketEngine.IPerformanceMonitor">
            <summary>
            Interface of IPerformanceMonitor
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.IPerformanceMonitor.Start">
            <summary>
            Start PerformanceMonitor.
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.IPerformanceMonitor.Stop">
            <summary>
            Stop PerformanceMonitor.
            </summary>
        </member>
        <member name="E:SuperSocket.SocketEngine.IPerformanceMonitor.OnStatusUpdate">
            <summary>
            Invokes when status update.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.IPerformanceMonitor.StatusUpdateInterval">
            <summary>
            Get or Set status update time in seconds.
            </summary>
        </member>
        <member name="T:SuperSocket.SocketEngine.IProcessServer">
            <summary>
            the interface for server instance which works as a process
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.IProcessServer.ProcessId">
            <summary>
            Gets the process id.
            </summary>
            <value>
            The process id. If the process id is zero, the server instance is not running
            </value>
        </member>
        <member name="T:SuperSocket.SocketEngine.IRemoteWorkItem">
            <summary>
            IRemoteWorkItem
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.IRemoteWorkItem.Setup(System.String,System.String,System.String,SuperSocket.SocketBase.Config.IServerConfig,SuperSocket.SocketBase.Provider.ProviderFactoryInfo[],System.String)">
            <summary>
            Setups the specified config.
            </summary>
            <param name="serverType">Type of the server.</param>
            <param name="bootstrapUri">The bootstrap URI.</param>
            <param name="assemblyImportRoot">The assembly import root.</param>
            <param name="config">The config.</param>
            <param name="factories">The factories.</param>
            <param name="startupConfigFile">The startup configuration file path</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.ProcessAppServer.#ctor(System.String,SuperSocket.SocketBase.Metadata.StatusInfoAttribute[])">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.SocketEngine.ProcessAppServer"/> class.
            </summary>
            <param name="serverTypeName">Name of the server type.</param>
            <param name="serverStatusMetadata">The server status metadata.</param>
        </member>
        <member name="P:SuperSocket.SocketEngine.ProcessAppServer.ProcessId">
            <summary>
            Gets the process id.
            </summary>
            <value>
            The process id. If the process id is zero, the server instance is not running
            </value>
        </member>
        <member name="M:SuperSocket.SocketEngine.ProcessBootstrap.#ctor(SuperSocket.SocketBase.Config.IConfigurationSource)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.SocketEngine.ProcessBootstrap"/> class.
            </summary>
            <param name="config">The config.</param>
        </member>
        <member name="T:SuperSocket.SocketEngine.SocketSession">
            <summary>
            Socket Session, all application session should base on this class
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.SocketSession.LogError(System.Exception,System.String,System.String,System.Int32)">
            <summary>
            Logs the error, skip the ignored exception
            </summary>
            <param name="exception">The exception.</param>
            <param name="caller">The caller.</param>
            <param name="callerFilePath">The caller file path.</param>
            <param name="callerLineNumber">The caller line number.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.SocketSession.LogError(System.String,System.Exception,System.String,System.String,System.Int32)">
            <summary>
            Logs the error, skip the ignored exception
            </summary>
            <param name="message">The message.</param>
            <param name="exception">The exception.</param>
            <param name="caller">The caller.</param>
            <param name="callerFilePath">The caller file path.</param>
            <param name="callerLineNumber">The caller line number.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.SocketSession.LogError(System.Int32,System.String,System.String,System.Int32)">
            <summary>
            Logs the socket error, skip the ignored error
            </summary>
            <param name="socketErrorCode">The socket error code.</param>
            <param name="caller">The caller.</param>
            <param name="callerFilePath">The caller file path.</param>
            <param name="callerLineNumber">The caller line number.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.SocketSession.Start">
            <summary>
            Starts this session.
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.SocketSession.StartSession">
            <summary>
            Says the welcome information when a client connectted.
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.SocketSession.OnClosed(SuperSocket.SocketBase.CloseReason)">
            <summary>
            Called when [close].
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.SocketSession.TrySend(System.Collections.Generic.IList{System.ArraySegment{System.Byte}})">
            <summary>
            Tries to send array segment.
            </summary>
            <param name="segments">The segments.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.SocketSession.TrySend(System.ArraySegment{System.Byte})">
            <summary>
            Tries to send array segment.
            </summary>
            <param name="segment">The segment.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.SocketSession.SendAsync(SuperSocket.Common.SendingQueue)">
            <summary>
            Sends in async mode.
            </summary>
            <param name="queue">The queue.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.SocketSession.SendSync(SuperSocket.Common.SendingQueue)">
            <summary>
            Sends in sync mode.
            </summary>
            <param name="queue">The queue.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.SocketSession.ValidateNotInSendingReceiving">
            <summary>
            Validates the socket is not in the sending or receiving operation.
            </summary>
            <returns></returns>
        </member>
        <member name="P:SuperSocket.SocketEngine.SocketSession.SessionID">
            <summary>
            Gets or sets the session ID.
            </summary>
            <value>The session ID.</value>
        </member>
        <member name="P:SuperSocket.SocketEngine.SocketSession.Config">
            <summary>
            Gets or sets the config.
            </summary>
            <value>
            The config.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.SocketSession.Closed">
            <summary>
            Occurs when [closed].
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.SocketSession.Client">
            <summary>
            Gets or sets the client.
            </summary>
            <value>The client.</value>
        </member>
        <member name="P:SuperSocket.SocketEngine.SocketSession.LocalEndPoint">
            <summary>
            Gets the local end point.
            </summary>
            <value>The local end point.</value>
        </member>
        <member name="P:SuperSocket.SocketEngine.SocketSession.RemoteEndPoint">
            <summary>
            Gets the remote end point.
            </summary>
            <value>The remote end point.</value>
        </member>
        <member name="P:SuperSocket.SocketEngine.SocketSession.SecureProtocol">
            <summary>
            Gets or sets the secure protocol.
            </summary>
            <value>The secure protocol.</value>
        </member>
        <member name="M:SuperSocket.SocketEngine.MarshalAppServer.#ctor(System.String)">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.SocketEngine.AppDomainAppServer"/> class.
            </summary>
            <param name="serviceTypeName">Name of the service type.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.MarshalAppServer.Setup(SuperSocket.SocketBase.IBootstrap,SuperSocket.SocketBase.Config.IServerConfig,SuperSocket.SocketBase.Provider.ProviderFactoryInfo[])">
            <summary>
            Setups the specified root config.
            </summary>
            <param name="bootstrap">The bootstrap.</param>
            <param name="config">The socket server instance config.</param>
            <param name="factories">The providers.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.MarshalAppServer.ReportPotentialConfigChange(SuperSocket.SocketBase.Config.IServerConfig)">
            <summary>
            Reports the potential configuration change.
            </summary>
            <param name="config">The server config which may be changed.</param>
            <exception cref="T:System.NotImplementedException"></exception>
        </member>
        <member name="M:SuperSocket.SocketEngine.MarshalAppServer.Start">
            <summary>
            Starts this server instance.
            </summary>
            <returns>
            return true if start successfull, else false
            </returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.MarshalAppServer.Stop">
            <summary>
            Stops this server instance.
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.MarshalAppServer.InitializeLifetimeService">
            <summary>
            Obtains a lifetime service object to control the lifetime policy for this instance.
            </summary>
            <returns>
            An object of type <see cref="T:System.Runtime.Remoting.Lifetime.ILease" /> used to control the lifetime policy for this instance. This is the current lifetime service object for this instance if one exists; otherwise, a new lifetime service object initialized to the value of the <see cref="P:System.Runtime.Remoting.Lifetime.LifetimeServices.LeaseManagerPollTime" /> property.
            </returns>
            <PermissionSet>
              <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="RemotingConfiguration, Infrastructure" />
              </PermissionSet>
        </member>
        <member name="P:SuperSocket.SocketEngine.MarshalAppServer.Name">
            <summary>
            Gets the name of the server instance.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.MarshalAppServer.Config">
            <summary>
            Gets the server's config.
            </summary>
            <value>
            The server's config.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.MarshalAppServer.State">
            <summary>
            Gets the current state of the work item.
            </summary>
            <value>
            The state.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.MarshalAppServer.SessionCount">
            <summary>
            Gets the total session count.
            </summary>
        </member>
        <member name="T:SuperSocket.SocketEngine.ISocketListener">
            <summary>
            The interface for socket listener
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.ISocketListener.Start(SuperSocket.SocketBase.Config.IServerConfig)">
            <summary>
            Starts to listen
            </summary>
            <param name="config">The server config.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.ISocketListener.Stop">
            <summary>
            Stops listening
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.ISocketListener.Info">
            <summary>
            Gets the info of listener
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.ISocketListener.EndPoint">
            <summary>
            Gets the end point the listener is working on
            </summary>
        </member>
        <member name="E:SuperSocket.SocketEngine.ISocketListener.NewClientAccepted">
            <summary>
            Occurs when new client accepted.
            </summary>
        </member>
        <member name="E:SuperSocket.SocketEngine.ISocketListener.Error">
            <summary>
            Occurs when error got.
            </summary>
        </member>
        <member name="E:SuperSocket.SocketEngine.ISocketListener.Stopped">
            <summary>
            Occurs when [stopped].
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.SocketListenerBase.Start(SuperSocket.SocketBase.Config.IServerConfig)">
            <summary>
            Starts to listen
            </summary>
            <param name="config">The server config.</param>
            <returns></returns>
        </member>
        <member name="E:SuperSocket.SocketEngine.SocketListenerBase.Stopped">
            <summary>
            Occurs when [stopped].
            </summary>
        </member>
        <member name="T:SuperSocket.SocketEngine.TcpAsyncSocketListener">
            <summary>
            Tcp socket listener in async mode
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.TcpAsyncSocketListener.Start(SuperSocket.SocketBase.Config.IServerConfig)">
            <summary>
            Starts to listen
            </summary>
            <param name="config">The server config.</param>
            <returns></returns>
        </member>
        <member name="P:SuperSocket.SocketEngine.SocketServerBase.SendingQueuePool">
            <summary>
            Gets the sending queue manager.
            </summary>
            <value>
            The sending queue manager.
            </value>
        </member>
        <member name="T:SuperSocket.SocketEngine.INegotiateSocketSession">
            <summary>
            The interface for socket session which requires negotiation before communication
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.INegotiateSocketSession.Negotiate">
            <summary>
            Start negotiates
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.INegotiateSocketSession.Result">
            <summary>
            Gets a value indicating whether this <see cref="T:SuperSocket.SocketEngine.INegotiateSocketSession"/> is result.
            </summary>
            <value>
              <c>true</c> if result; otherwise, <c>false</c>.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.INegotiateSocketSession.AppSession">
            <summary>
            Gets the app session.
            </summary>
            <value>
            The app session.
            </value>
        </member>
        <member name="E:SuperSocket.SocketEngine.INegotiateSocketSession.NegotiateCompleted">
            <summary>
            Occurs when [negotiate completed].
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.AsyncStreamSocketSession.Start">
            <summary>
            Starts this session communication.
            </summary>
        </member>
        <member name="T:SuperSocket.SocketEngine.Configuration.CertificateConfig">
            <summary>
            Certificate configuration
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.CertificateConfig.FilePath">
            <summary>
            Gets the certificate file path.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.CertificateConfig.Password">
            <summary>
            Gets the password.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.CertificateConfig.StoreName">
            <summary>
            Gets the the store where certificate locates.
            </summary>
            <value>
            The name of the store.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.CertificateConfig.StoreLocation">
            <summary>
            Gets the store location of the certificate.
            </summary>
            <value>
            The store location.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.CertificateConfig.Thumbprint">
            <summary>
            Gets the thumbprint.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.CertificateConfig.ClientCertificateRequired">
            <summary>
            Gets a value indicating whether [client certificate required].
            </summary>
            <value>
            <c>true</c> if [client certificate required]; otherwise, <c>false</c>.
            </value>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.CertificateConfig.KeyStorageFlags">
            <summary>
            Gets a value that will be used to instantiate the X509Certificate2 object in the CertificateManager
            </summary>
        </member>
        <member name="T:SuperSocket.SocketEngine.Configuration.Listener">
            <summary>
            Listener configuration
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Listener.Ip">
            <summary>
            Gets the ip of listener
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Listener.Port">
            <summary>
            Gets the port of listener
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Listener.Backlog">
            <summary>
            Gets the backlog.
            </summary>
        </member>
        <member name="P:SuperSocket.SocketEngine.Configuration.Listener.Security">
            <summary>
            Gets the security option, None/Default/Tls/Ssl/...
            </summary>
        </member>
        <member name="T:SuperSocket.SocketEngine.Configuration.ListenerConfigCollection">
            <summary>
            Listener configuration collection
            </summary>
        </member>
        <member name="T:SuperSocket.SocketEngine.Configuration.ServerCollection">
            <summary>
            Server configuration collection
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.Configuration.ServerCollection.AddNew(SuperSocket.SocketEngine.Configuration.Server)">
            <summary>
            Adds the new server element.
            </summary>
            <param name="newServer">The new server.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.Configuration.ServerCollection.Remove(System.String)">
            <summary>
            Removes the specified server from the configuration.
            </summary>
            <param name="name">The name.</param>
        </member>
        <member name="T:SuperSocket.SocketEngine.SocketServerFactory">
            <summary>
            Default socket server factory
            </summary>
        </member>
        <member name="M:SuperSocket.SocketEngine.SocketServerFactory.CreateSocketServer``1(SuperSocket.SocketBase.IAppServer,SuperSocket.SocketBase.ListenerInfo[],SuperSocket.SocketBase.Config.IServerConfig)">
            <summary>
            Creates the socket server.
            </summary>
            <typeparam name="TRequestInfo">The type of the request info.</typeparam>
            <param name="appServer">The app server.</param>
            <param name="listeners">The listeners.</param>
            <param name="config">The config.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.UdpSocketListener.Start(SuperSocket.SocketBase.Config.IServerConfig)">
            <summary>
            Starts to listen
            </summary>
            <param name="config">The server config.</param>
            <returns></returns>
        </member>
        <member name="M:SuperSocket.SocketEngine.UdpSocketServer`1.#ctor(SuperSocket.SocketBase.IAppServer,SuperSocket.SocketBase.ListenerInfo[])">
            <summary>
            Initializes a new instance of the <see cref="T:SuperSocket.SocketEngine.UdpSocketServer`1"/> class.
            </summary>
            <param name="appServer">The app server.</param>
            <param name="listeners">The listeners.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.UdpSocketServer`1.OnNewClientAccepted(SuperSocket.SocketEngine.ISocketListener,System.Net.Sockets.Socket,System.Object)">
            <summary>
            Called when [new client accepted].
            </summary>
            <param name="listener">The listener.</param>
            <param name="client">The client.</param>
            <param name="state">The state.</param>
        </member>
        <member name="M:SuperSocket.SocketEngine.UdpSocketSession.UpdateRemoteEndPoint(System.Net.IPEndPoint)">
            <summary>
            Updates the remote end point of the client.
            </summary>
            <param name="remoteEndPoint">The remote end point.</param>
        </member>
    </members>
</doc>
lib/SuperSocket.SocketEngine.dll
Binary files differ
lib/_log4net.dll
Binary files differ
lib/_log4net.xml
lib/log4net.dll
Binary files differ