[开源]FreeSCADA的研究

1.开源项目概述

a) 官网:http://www.free-scada.org/

b) 项目目的:设计一个组态软件,功能为SCADA系统,最终目标为MES系统。

c) 项目技术点:The main programming language for the project is C# and .Net 3.0 platform. At this moment there are several parts of .Net used:

  WinForms (GUI controls and window management), WPF and XAML (schema editing capabilities) and OPC (communication with 3rd party devices).

  There are also plans to try a few more things:

  ADO.NET, WCF, LINQ, Silverlight 2.0 and OPC UA.

d) 项目状态:目前已经停止更新,最后一个版本为FreeSCADA 2.0.0.3。

2. 项目源码解析

a) 项目工程整体结构图如下:

There are two main modules for interacting with users: Designer and Run Time.

Designer - a tool used for creation of documents:
1) Definition of links with data sources
2) Setting up rules for archiving
3) Declaring alarms and expected user reaction for them
4) Creation of visual schemes and report templates
5) Setting up scheduler of report generation

Run Time - a tool used to regular work with the document:
1) Archiving data in real time
2) Alarm generation
3) Data visualization
4) Report generation
5) Sending visual data (schemes) to remote clients by using HTTP protocol for Web access as Silverlight 2.0 application
6) Sending data to remote clients by OPC XMLDA protocol

There is also a set of communication plugins which provide abstract communication layer with other applications (e.g. OPC, MODBUS).

b) 项目C#工程结构如下:

一共20个工程,其中Designer为启动工程(主UI)。

3. 工程源码详细分析

1) Archiver(对应主UI->Project->Database settings界面)

  特殊引用:

  1) Common

  普通类文件:

  1) Archiver.cs:定义了公共类ArchiverMain。该类主要完成通道(ChannelsSettings)和数据库设定(databaseSettings),数据库读(DbReader)和写(DbWriter),通道更新线程开始/停止(Thread channelUpdaterThread)。

  2) ChannelInfo.cs:定义了公共类ChannelInfo。该类主要完成通道属性的定义,以及两个基类函数的复写(Equals(object obj)和GetHashCode())。

  3) ChannelsSettings.cs:定义了公共类ChannelsSettings。该类主要完成List<ChannelInfo>和List<Rule>的声明,和规则(Rule)的增加和清除,以及相关配置的XML方式存储和载入。

  4) Conditions.cs:定义了抽象类BaseCondition和继承类TimeIntervalCondition。BaseCondition类中的函数全部为虚拟函数,子类可以选择性继承。其中虚拟函数Process()用于触发一次计时检验,在固定时间间隔后通过IsValid变量来呈现结果。

  [Serializable]关键字:串行化是指存储和获取磁盘文件、内存或其他地方中的对象。在串行化时,所有的实例数据都保存到存储介质上,在取消串行化时,对象会被还原,且不能与其原实例区别开来。

  [XmlInclude(typeof(TimeIntervalCondition))]关键字:在Web Services方法中,往往使用的都是一个具体类型的参数,这个参数一般就是一个数据对象。ASP.NET Web Services通过声明XmlIncludeAttribute可以实现Web Services方法中运用多态。

  XmlIncludeAttribute允许XmlSerializer在序列化或反序列化对象时识别类型。当应用XmlIncludeAttribute时,需指定派生类的Type。XmlSerializer序列化同时包含基类和派生类的对象之后,它就可以识别两种对象类型。(详细参见:http://www.cnblogs.com/zhaozhan/archive/2010/10/25/1860867.html

  [Browsable(false)]关键字:使用值 false的BrowsableAttribute构造函数标记的成员不适合在设计时进行编辑,因此,它们不会在可视化编辑器中显示。默认为 true。

  [XmlIgnore]关键字:XmlIgnoreAttribute 指示XmlSerializer方法不序列化公共字段或公共读/写属性值。

  5) DatabaseFactory.cs:定义了公共静态类DatabaseFactory。其中枚举变量ProcessorType用来定义三种CPU架构(x86, x64, IPF)。GetProcessorArch()用来获取机器CPU的架构;DataTable GetAvailableDB()用来返回一个含有一条SQLite数据库连接信息的DataTable;DbProviderFactory Get(string invariantName)用来根据参数返回一个DbProviderFactory (DbProviderFactory用来达到实现多数据库访问的文章)。

  其中DbProviderFactory的定义常放在app.config中,形如:

<system.data>
  <DbProviderFactories>
    <add name="OracleClientFactory" invariant="OracleClientFactory" description="Oracle.ManagedDataAccess.Client.OracleClientFactory"
      type="Oracle.ManagedDataAccess.Client.OracleClientFactory,Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </DbProviderFactories>
</system.data>

  其中要注意的,是 invariant 和 type 属性。

  invariant: 可以通过这个属性值获取到对应DbProviderFactory类型,如DbProviderFactories.GetFactory("OracleClientFactory") ;

  type:类名(含命名空间),程序集名称,程序集信息。

  6) DatabaseSettings.cs:定义了可序列化的公共类DatabaseSettings。主要完成数据库的设置(DbProvider, DbFile, DbSource, DbCatalog, DbUser, DbPassword, DbConnectionString);Load()完成读入settings/archiver/database.cfg的数据流,并XML反序列化为DatabaseSettings对象;Save()完成XML序列化DatabaseSettings为数据流并存入到settings/archiver/database.cfg;CreateConnectionString()根据DbConnectionString的内容创建数据库连接的字符串。

  7) DbReader.cs:定义了私有类DbReader。主要完成数据库读取相关的操作,两个主要成员变量为DbProviderFactory和DbConnection类型。Open()完成数据库的开启;Close()完成数据库的关闭和相关资源的释放;DataTable ExecCommand(string selectCommand)完成相关数据库读取操作并返回相关数据表。

  8) DbWriter.cs:定义了私有类DbWriter。主要完成数据库读取相关的操作,两个主要成员变量为DbProviderFactory和DbConnection类型。Open()完成数据库的开启;Close()完成数据库的关闭和相关资源的释放;bool WriteChannels(List<ChannelInfo> channels)完成相关数据库写入操作(写入的数据为SCADA各记录通道的数据)。

  9) PropertyCommand.cs:定义了私有类PropertyCommand(继承自Common工程下的BaseCommand抽象类,BaseCommand类实现了ICommand接口,而ICommand接口又使用了ICommandItems接口)。重写的Execute()方法用于新建并显示UI类实例DatabaseSettingsForm。

  10) Rule.cs:定义了可序列化的公共类Rule。主要成员变量为List<ChannelInfo>和List<BaseCondition>。AddChannel(ChannelInfo channel)完成ChannelInfo对象的添加;AddCondition(BaseCondition condition)完成BaseCondition对象的添加。

  11) Storage.cs:空白类。

  UI类:

  1) DatabaseSettingsForm.cs:

  特殊文件:

  1) StringConstants.resx:用于存储字符串键值对比如(TimeIntervalConditionName<->Time interval condition,调用的话形如StringConstants.TimeIntervalConditionName)

2) Archiver.Tests(工程Archiver的测试工程)

  特殊引用:

  1) Archiver

  2) Common

  3) Communication.SimulatorPlug

  4) nunit.framework(NUnit测试框架插件):

  [TestFixture]关键字:本属性标记一个类包含测试。

  [SetUp]关键字:定义测试函数初始化函数,每个测试函数运行前都会被调用一次。

  [TearDown]关键字:定义测试函数销毁函数,每个测试函数执行完后都会被调用一次。

  [Test]关键字:Test属性用来标记一个类(已经标记为TestFixture)的某个方法是可以测试的。

  5) NUnitForms(NUnit测试框架插件)

  6) SourceGrid(SourceGrid4_11数据显示的表格控件)

  普通类文件:

  1) ChannelsSettingsTest.cs:测试Archiver工程下的ChannelsSettings类。[Test]GetChannelList()用于测试创建数据通道操作的正确性(注意ArchiverMain.Current返回的是静态变量static ArchiverMain instance;);[Test]SaveLoadRules()用于测试存储/载入规则的正确性。非测试类方法CreateFewChannels()方法用于创建几个测试数据通道;CreateRandomChannels()方法是CreateFewChannels()方法中ExpectModal方法的参数。

  2) DatabaseSettingsTest.cs:测试Archiver工程下的DatabaseSettings类。[Test]SaveLoad()用于测试导出数据库配置到settings/archiver/database.cfg和从settings/archiver/database.cfg导入数据库配置的过程的数据一致性。

  3) DbFactoryTest.cs:测试Archiver工程下的DatabaseFactory类。[Test]ProvidersList用于测试静态类DatabaseFactory可用的数据库种类;[Test]CreateProvider用于测试根据静态类DatabaseFactory可用的数据库种类来创建DbProviderFactory是否正常。

  4) Helpers.cs:定义了GridTester类(继承自NUnit测试框架下的ControlTester类)。SetChannelType(int channelNo, string type)用于设置成员变量SourceGrid.Grid Control去更新对应表格部分的内容;SetChannelName(int channelNo, string name)用于设置成员变量SourceGrid.Grid Control去更新对应表格部分的内容。

  UI类:无

3) CLServer(Command Line Server)

  特殊引用:

  1) Common

  2) Plossum CommandLine(???)

  普通类文件:

  1) ChannelEventHandler.cs:定义了私有类ChannelEventHandler。主要成员变量IDataUpdatedCallback(接口)和IChannel(接口),以及一个EventHandler。构造函数ChannelEventHandler(IChannel channel, IDataUpdatedCallback callback, IContextChannel contextChannel)实现成员变量的赋值以及成员变量事件的绑定;OnContextChannelClosing(object sender, EventArgs e)实现通道关闭时的事件响应;OnChannelValueChanged(object sender, EventArgs e)实现通道数值更改时的事件响应。

  2) ChannelInfo.cs:定义了公共类ChannelInfo。

  [DataContract]服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型,一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送。

  [DataMember]经常看到某些类的属性上面标示[Serializable]或者[DataContract]序列化时,用到,一般都是用[Serializable]wcf中如果你的model类需要client和server之间传递,用[DataContract]属性上面加[DataMember]也是WCF中用到的,[DataContract]在类的顶部写上,[DataMember]在公共的属性顶部写上。

  3) ChannelState.cs:定义了枚举变量ChannelStatusFlags和公共类ChannelState。

  4) IChannelInformationRetriever.cs:定义了私有接口IChannelInformationRetriever。

  [ServiceContract]和[OperationContract]:接口前面加了[ServiceContract],意思是是把这个接口(把扩继承这个接口的类)声明为服务契约,服务契约是对客户端而言的,就是这个接口暴露在客户端面前。但看得见接口不代表可以看得见接口里的方法,所以想把方法也声明为对客户端可见,得在声明方法的签名加[OperationContract]。

  5) IDataRetriever.cs:定义了私有接口IDataRetriever。

  [ServiceContract(CallbackContract = typeof(IDataUpdatedCallback), SessionMode = SessionMode.Required)]:SerivceContract特性的成员列表

  参数                         说明

  CallbackContract           当契约是双工时,读取或设置回调契约的类型

  ConfigurationName        获取或设置服务在应用程序配置文件中的名称

  HasProtectionLevel          读取一个值,表示此成员是否有一个保护级别

  Name                          获取或设置WSDL文档中<portType>元素的名称

  Namespace                  获取或设置WSDL文档中<portType>元素的名称空间

  ProtectionLevel            设置对契约的绑定是否支持ProtectionLevel属性的值

  SessionMode                获取或设置会话是否允许,以及是否得到了请求  

  [OperationContract(IsOneWay = true)]:“单向操作”客户端一旦发出请求,WCF会生成一个请求,不会给客户端返回任何消息。“单向操作”不同于异步操作,虽然“单向操作”只是在发出调用的瞬间阻塞客户端,但如果发出多个单向调用,WCF会将请求调用放入队列,并在某个时候执行。队列存储调用的个数是有限的,一旦发出的调用个数超出了队列存储调用的设置值,则会发生阻塞现象,因为调用无法放入队列。当队列的请求出列后,产生阻塞的调用就会放入队列,并解除对客户端的阻塞。所有的WCF绑定通信协议都支持“单向操作”。配置“单向操作”的方式也很简单,WCF的OperationContract 定义了IsOneWay属性,IsOneWay默认是false(因为默认是请求-应答模式,不是单向操作模式),我们在方法契约中指定IsOneWay属性为true就可以了。 

  6) IDataUpdatedCallback.cs:定义了私有接口IDataUpdatedCallback。

  7) Options.cs:定义了私有类Options。

  [CommandLineManager]开源插件Plossum CommandLine提供的特性。

  [CommandLineOptionGroup]开源插件Plossum CommandLine提供的特性。

  8) Program.cs:定义了私有类Program。

  9) Service.cs:定义了私有类Service(实现了IChannelInformationRetriever接口,IDataRetriever接口)。主要成员变量有List<ChannelEventHandler>和ChannelInfo[]。GetChannels()返回当前通讯服务插件并返回所有的数据采集通道信息列表;GetChannelsCount()返回所有数据采集通道列表的长度;GetChannel(long index)返回特定数据采集通道的信息;RegisterCallback(string channelId)注册相关数据采集通道的回调事件;OnHandlerDisconnected(object sender, EventArgs e)定义回调事件;SetChannelValue(string channelId, string value)设置对应数据采集通道的相关值;GetChannelState(string channelId)返回相关数据采集通道的状态。

  UI类:无

4) CLServer.ClientProxies

  特殊引用:无

  普通类文件:

  1) Service.cs:

  UI类:无

5) CLServer.Tests(工程CLServer的测试工程)

  特殊引用:

  1) CLServer.ClientProxies:

  2) nunit.framework:

  普通类文件:

  1) ChannelInformationRetrieverTest.cs:

  2) DataRetrieverTest.cs:

  3) ServerStarter.cs:

  UI类:无

6) Common

  特殊引用:

  1) ICsharpCode.SharpZipLib(SharpZipLib插件。一个免费的Zip操作类库,可以利用它对 ZIP 等多种格式进行压缩与解压。http://icsharpcode.github.io/SharpZipLib)

  2) IronPython(IronPython插件。IronPython is an implementation of the Python programming language for Microsoft .NET and Mono.。http://ironpython.codeplex.com)

  3) IronPython.Modules(IronPython)

  4) Microsoft.Scripting(IronPython)

  5) Mircosoft.Scripting.Core(IronPython)

  6) WindowsBase(.NET framework 3.0特性。WPF,或者是FORMS或web编程中调用了WPF,都必须要增加这该空间的引用)

  普通类文件:

  1) BaseChannel.cs:

  2) BaseCommand.cs:

  3) BaseCommandContext.cs:

  4) BaseDropDownCommand.cs:

  5) Commands.cs:

  6) CommunationPlugs.cs:

  7) ConfigurationManager.cs:

  8) Env.cs:

  9) IChannel.cs:

  10) ICommand.cs:

  11) ICommandContext.cs:

  12) ICommandItems.cs:

  13) ICommands.cs:

  14) ICommunicationPlug.cs:

  15) IEnvironment.cs:

  16) IVisualControlDescriptor.cs:

  17) IVisualControlsPlug.cs:

  18) Logger.cs:

  19) MRUManager.cs:

  20) NullCommand.cs:

  21) Project.cs:

  22) VisualControlsPlugs.cs:

  UI类:无

  特殊文件:

  1) Common.snk:密钥和签名文件

 

  2) ReadOnlyPropertyGrid.cs:

  3) StringReources.resx:

7) Common.Tests(工程Common的测试工程)

  特殊引用:

  1) Common

  2) nunit.framework

  普通类文件:

  1) CommandMock.cs:

  2) CommandsTest.cs:

  3) CommunationPlugsTest.cs:

  4) ConfigurationManagerTest.cs:

  5) ProjectTest.cs:

  UI类:无

8) CommonGUI

  特殊引用:

  1) Archiver

  2) Common

  3) DynamicDataDisplay(DynamicDataDisplay控件是一个功能很强的绘图工具,除了能生成曲线外,还有很多其他功能,具体见http://dynamicdatadisplay.codeplex.com)

  4) IronPython

  5) IronPython.Modules

  6) Microsoft.Scripting

  7) Mircosoft.Scripting.Core

  8) PresentationFramework(.NET framework 3.0特性)

  9) PresentationCore(.NET framework 3.0特性)

  10) WindowsBase

  11) WindowsFormsIntegration(.NET framework 3.0特性。用于WPF引入WindowsForms)

  12) WPFToolkit(wpftoolkit插件。http://wpf.codeplex.com)

  普通类文件:

  1) AnimatedImage.cs:

  2) BaseManipulator.cs:

  3) BaseTool.cs:

  4) ChannelDataProvider.cs:

  5) ChannelDataSource.cs:

  6) MediaProvider.cs:

  7) PerfTimer.cs:

  8) QuadTree.cs:

  9) SchemaDocument.cs:

  10) SolidBrushConverter.cs:

  11) TimeChartControl.cs:

  12) VirtualCanvas.cs:

  13) VirtualElement.cs:

  14) WPFShemaContainer.cs:

  UI类:无

9) Communication.CLServer

  特殊引用:

  1) CLServer.ClientProxies

  2) Common

  3) DevAge.Core(SourceGrid4_11数据显示的表格控件)

  4) DevAge.Windows.Forms(SourceGrid4_11数据显示的表格控件)

  5) SourceGrid

  普通类文件:

  1) ChannelConnection.cs:

  2) ChannelFactory.cs:

  3) ConnectionGroup.cs:

  4) Plugin.cs:

  5) PropertyCommand.cs:

  6) RemoutingChannel.cs:

  7) StringConstants.cs:

  UI类:

  1) ImportChannelsForm.cs:

  2) ImportProgressForm.cs:

  3) SettingsForm.cs:

10) Communication.MODBUSPlug

  特殊引用: 

  1) Common

  2) DevAge.Core

  3) DevAge.Windows.Forms

  4) Modbus(NModbus插件)

  5) OpcRcw.Comn(OPC插件)

  6) OpcRcw.Da(OPC插件)

  7) SourceGrid

  普通类文件:

  1) Channel.cs:

  2) ChannelFactory.cs:

  3) IModbusStation.cs:

  4) ModbusBaseClientStation.cs:

  5) ModbusEnums.cs:

  6) ModbusSerialClientStation.cs:

  7) ModbusTCPClientStation.cs:

  8) Plugin.cs:

  9) PropertyCommand.cs:

  10) StationFactory.cs:

  11) StringConstants.cs:

  UI类:

  1) AddStationForm.cs:

  2) ModifyChannelForm.cs:

  3) ModifySerialClientStationForm.cs:

  4) ModifyTCPClientStationForm.cs:

  5) SettingsForm.cs:

11) Communication.OPCPlug

  特殊引用: 

  1) Common

  2) DevAge.Core

  3) DevAge.Windows.Forms

  4) OpcRcw.Comn

  5) OpcRcw.Da

  6) SourceGrid

  普通类文件:

  1) ChannelFactory.cs:

  2) ConnectionGroup.cs:

  3) OPCBaseChannel.cs:

  4) OPCDataCallback.cs:

  5) Plugin.cs:

  6) PropertyCommand.cs:

  7) StringConstants.cs:

  UI类:

  1) ImportOPCForm.cs:

  2) SettingsForm.cs:

12) Communication.OPCPlug.Tests(工程Communication.OPCPlug的测试工程)

  特殊引用:

  1) Common

  2) Communication.OPCPlug

  3) nunit.framework

  4) NUnitForms

  5) SourceGrid

  普通类文件:

  1) PluginLoadingTest.cs:

  2) ReadWriteChannelsTest.cs:

  UI类:无

13) Communication.SimulatorPlug

  特殊引用:

  1) Common

  2) DevAge.Core

  3) DevAge.Windows.Forms

  4) IronPython

  5) IronPython.Modules

  6) Microsoft.Scripting

  7) Microsoft.Scripting.Core

  8) Puzzle.SyntaxBox.NET3.5(SyntaxBox插件。Powerful Syntax Highlight Windows Forms Control for the Microsoft.NET Platform)

  9) SourceGrid

  普通类文件:

  1) ChannelFactory.cs:

  2) ComputableChannel.cs:

  3) CurrentTimeChannel.cs:

  4) GenericChannel.cs:

  5) Plugin.cs:

  6) PropertyCommand.cs:

  7) RampIntegerChannel.cs:

  8) RandomIntegerChannel.cs:

  9) SawIntegerChannel.cs:

  10) SinusDoubleChannel.cs:

  11) StringConstants.cs:

  UI类:

  1) SettingsForm.cs:

14) Communication.SimulatorPulg.Tests(工程Communication.SimulatorPulg的测试工程)

  特殊引用:

  1) Common

  2) Communication.SimulatorPlug

  3) nuint.framework

  4) NUnitForms

  5) SourceGrid

  普通类文件:

  1) PluginLoadingTest.cs:

  2) PluginSettingsFormTest.cs:

  3) PluginTest.cs:

  UI类:无

15) Communication.SNMPPlug

  特殊引用:

  1) Common

  2) DevAge.Core

  3) DevAge.Windows.Forms

  4) Microsoft.Practices.Unity(#SNMP插件)

  5) Microsoft.Practices.Unity.Configuration(#SNMP插件)

  6) SharpSnmpLib(#SNMP插件)

  7) SharpSnmpLib.Controls(#SNMP插件)

  8) SharpSnmpLib.Mib(#SNMP插件)

  9) SourceGrid

  普通类文件:

  1) AgentFactory.cs:

  2) Channel.cs:

  3) ChannelFactory.cs:

  4) IProfileRegistry.cs:

  5) Plugin.cs:

  6) PropertyCommand.cs:

  7) SNMPAgent.cs:

  8) StringConstants.cs:

  UI类:

  1) FormProfile.cs:

  2) FormTable.cs:

  3) ModifyChannelForm.cs:

  4) SettingsForm.cs:

  特殊文件:

  1) app.config:

16) Communication.Timers

  特殊引用:

  1) Common

  2) DevAge.Core

  3) DevAge.Windows.Forms

  4) SourceGrid

  普通类文件:

  1) AbsoluteTimerChannel.cs:

  2) ChannelFactory.cs:

  3) Plugin.cs:

  4) PropertyCommand.cs:

  5) RelativeTimerChannel.cs:

  6) StringConstants.cs:

  UI类:

  1) SettingsForm.cs:

17) Designer

  特殊引用:

  1) Archiver

  2) Common

  3) CommonGUI

  4) DevAge.Core

  5) DevAge.Windows.Forms

  6) Kent.Boogaart.Converters(WPF Converters provides a number of generic binding converters for use in WPF and Silverlight applications. Online at http://wpfconverters.codeplex.com)

  7) PresemtationCore

  8) PresentationFramework

  9) Puzzle.SyntaxBox.NET3.5

  10) SourceGrid

  11) ToolBox(toolbox插件)

  12) UIAutomationProvider(.NET framework 3.0特性)

  13) Weifenluo.WinFormsUI.Docking(布局控件。https://sourceforge.net/projects/dockpanelsuite)

  14) WindowsBase

  15) WindowsFormsIntegration

  普通类文件:

  1) CommandManager.cs:

  2) HelpCommands.cs:

  3) Program.cs:

  4) TooloxContext.cs:

  5) WindowManager.cs:

  UI类:

  1) MainForm.cs:

  特殊文件:

  1) DialogMessages.resx:

18) Designer.Tests(工程Designer的测试工程)

  特殊引用:  

  1) Core

  2) Designer

  3) nunit.framework

  4) UIAutomationClient(.NET framework 3.0特性)

  5) UIAutomationTypes(.NET framework 3.0特性)

  6) White.Nunit(White测试框架。White与WatiN类似,它封装了微软的UIAutomation库和Window消息,可以用于测试包括Win32,WinForm, WPF和SWT(java)在内的软件。http://white.codeplex.com)

  7) WindowsBase

  普通类文件:

  1) BindingDialogWrapper.cs:

  2) BindingEditingTest.cs:

  3) GridWrapper.cs:

  4) Helpers.cs:

  5) SaveLoadFunctionalityTest.cs:

  6) SchemaEditingTest.cs:

  7) ToolBoxWrapper.cs:

  UI类:无

  特殊文件:

  1) App.config

19) RunTime

  特殊引用:

  1) Archiver

  2) Common

  3) CommonGUI

  4) DevAge.Core

  5) DevAge.Windows.Forms

  6) NPlot(NPlot插件。NPlot is a free charting library for .NET。http://netcontrols.org/nplot/wiki)

  7) PresemtationCore

  8) PresemtationFramework

  9) SourceGrid

  10) Weifenluo.WinFormsUI.Docking

  11) WindowsBase

  12) WindowsFormsIntegration

  普通类文件:

  1) CommandManager.cs:

  2) DocumentCommands.cs:

  3) Program.cs:

  4) WindowManager.cs:

  UI类:

  1) MainForm.cs:

  特殊文件:

  1) DialogMessages.resx:

  2) StringResources.resx:

20) VisualControls.FS2EasyControls

  特殊引用:

  1) Common

  2) Design

  3) PresemtationCore

  4) PresemtationFramework

  5) WindowsBase

  普通类文件:

  1) AnalogTextValue.cs:

  2) AnalogTextValueWrappers.cs:

  3) BinaryColorText.cs:

  4) BinaryColorTextWrappers.cs:

  5) Plugin.cs:

  6) PropertyCommand.cs:

  7) StringConstants.cs:

  UI类:无

原文地址:https://www.cnblogs.com/jayhust/p/5675443.html