^_^填坑备忘^_^C#自动化编程实现STK+Exata对卫星互联网星座进行网络仿真

  1. C#实际选择 STK11版本 or STK12版本的问题备注。

C#自动化客户端调用STK时,实际选择 STK11版本 or STK12版本 的调试运行备注】

以下代码“更新并重新打包备份为”testSTKQualNetInterface备份08.1_★避坑★【种子卫星:天线直接安装在卫星上,中间不能有Sensor传感器】.zip

源码文件: g:\teststkqualnetinterface\starlinksimulationclient.cs

        private void button_OpenSTK_Click(object sender, EventArgs e)

        {

            #region 打开STK引擎:首先尝试打开现有STK软件,没有现成打开的STK;则新建打开一个STK软件实例

            try

            {//尝试获取现在已经在运行的 STK实例

                m_uiApp = System.Runtime.InteropServices.Marshal.GetActiveObject("STK11.Application") as AgUiApplication;

                #region C#自动化客户端调用STK时,实际选择 STK11版本 or STK12版本 的调试运行备注 @2024-5-7 09:16:28

                // 貌似上面的 GetActiveObject("STK11.Application") 指定调用 STK11版本,

                // 其实不是,真正决定C#调用哪个版本的的STK,即【实际选择 STK11版本 or STK12版本】,

                // 是由【[testSTKQualNetInterface]】C#工程里引用的[AGI.STKObjects.Interop]系列【.Net互操作程序集】的STK版本决定的!

                // 比如,目前这个工程引用的[AGI.STKObjects.Interop.dll]是 12.0.0.0,那么运行时调用的就是 STK12版本

                // 所以,貌似 GetActiveObject("STK11.Application") 中的 "STK11.Application" 对 STK11版本 or STK12版本 都适用。

                #endregion C#自动化客户端调用STK时,实际选择 STK11版本 or STK12版本 的调试运行备注

  1. 将〔testSTKQualNetInterface备份08.1_★避坑★【种子卫星:天线直接安装在卫星上,中间不能有Sensor传感器】.zip〕中的《 Program.cs  StarlinkSimulationClient.cs  StarlinkSimulationClient.Designer.cs  XLsatNPF.cs 》源码文件重新替换到〔F:\WS_STK_use_Interop\test_Client 〕解决方案中的‘testSTKQualNetInterface’工程中,调试运行:
    1. 编译通过、运行正常,未报错;
    2. ‘一键自动化测试’,最后一步是调用[button_SaveToVDF_Click]加密保存场景为*.vdf,密码为 roottoor ;
    3. 调试运行时,C#调用STK11.6正常;保存的[D:\Temp\Starlink5x4_20SAT-SimScenario.vdf],既能用 STK11.6 也能用 STK12.2 打开(密码roottoor);

STK11.6逆向编译生成的Exata插件,测试运行正常 卫星节点位置可以正常调用STK进行更新】★STK+Exata联合仿真★

    1. 【STK11.6逆向编译生成的Exata插件,测试运行正常】用STK11.6重新打开加密保存的[D:\Temp\Starlink5x4_20SAT-SimScenario.vdf],调出‘软件逆向(反编译后重新编译)JSLS生成的’【QualNet Interface】场景管理器,对卫星Antenna天线建立网络连接并且建立星间链路,再在【QualNet Interface】场景管理器里单击‘go’,能够正常调用Exata进行网络仿真!
    2. STK11.6调用Exata插件进行网络仿真,生成的仿真*.config配置文件及目录,可以正常用Exata7.3打开(Exata6.2设置了调试断点会报错),卫星节点位置可以正常调用STK进行更新
  1. 因为【QualNet Interface Scenario Explorer】场景管理器,本质上在操作时,是调用‘作为组件服务的[AGI.StkQualnetUiControls]服务器’,所以跟踪调试的时候:

★客户端服务器CS模式 调试运行 QualNet Interface Scenario Explorer】场景管理器STK.Net组件插件

    1. 首先还是运行【[F:\WS_STK_use_Interop\test_Client]】解决方案里的“C#客户端”,单击‘一键自动化测试’,等待C#客户端操作STK服务器,创建仿真场景完毕;
    2. 然后打开【[F:\WS_STK_use_Interop\test_Server]】解决方案,:
    3. 第三,在打开的【[F:\WS_STK_use_Interop\test_Server]】解决方案中,附加到进程,附加到[AgUiApplication.exe]STK软件进程
    4. 在【[F:\WS_STK_use_Interop\test_Server]】解决方案的《NetworkInterfaceForm.cs》(位于[F:\WS_STK_use_Interop\test_Server\AGI.StkQualnetUiControls\]工程),找到构造函数,下断点以便跟踪调试;

              public NetworkInterfaceForm(NetworkInterface networkInterface, Entity parentEntity, AgStkObjectRoot stkRoot)

    1. 在【[test_Client]】客户端解决方案运行的C#程序打开的STK11.6软件中,手动操作调出【QualNet Interface Scenario Explorer】场景管理器,选定某颗卫星(比如XL11),右键‘Add’,目的是为该卫星添加网络接口Interface; è 马上可以发现【[test_Server]】里的NetworkInterfaceForm(NetworkInterface networkInterface, Entity parentEntity, AgStkObjectRoot stkRoot)断点被拦截命中,这时的调用堆栈是:

>         AGI.StkQualnetUiControls.dll!AGI.StkQualnetUiControls.NetworkInterfaceForm.NetworkInterfaceForm(AGI.StkQualnetObjectModel.NetworkInterface networkInterface, AGI.StkQualnetObjectModel.Entity parentEntity, AGI.STKObjects.AgStkObjectRoot stkRoot) 24            C#

           AGI.StkQualnetUiControls.dll!AGI.StkQualnetUiControls.StkQualnetScenarioExplorer.OnEntityAddNetworkInterfaceMenuItemClick(object sender, System.EventArgs e) 253   C#

           AGI.StkQualnetUiControls.dll!AGI.StkQualnetUiControls.StkQualnetScenarioExplorer.networkInterfacesContextMenuAdd_Click(object sender, System.EventArgs e) 266           C#

  1. 经跟踪调试,锁定【QualNet Interface Scenario Explorer】场景管理器‘针对Antenna天线添加Interface网络接口’的关键代码:

★调试找到关键代码★【场景管理器‘针对Antenna天线添加Interface网络接口’】

    1. F:\WS_STK_use_Interop\test_Server\AGI.StkQualnetUiControls\StkQualnetScenarioExplorer.cs】的[ OnEntityAddNetworkInterfaceMenuItemClick ],其中,两句最关键的是【 new NetworkInterfaceForm(null, entityTreeNode.Entity, this.StkRoot); 】和【 NetworkInterface networkInterface = networkInterfaceForm.GetNetworkInterface(); 】;
    2. F:\WS_STK_use_Interop\test_Server\AGI.StkQualnetUiControls\NetworkInterfaceForm.cs】的[ public NetworkInterface GetNetworkInterface() ];
    3. 最终结果:对[AGI.StkQualnetObjectModel.NetworkInterface]类型的【[networkInterface]类成员变量】进行赋值。

① 【《StkQualnetScenarioExplorer.cs》】的[ OnEntityAddNetworkInterfaceMenuItemClick ]:

源码如下:

                          private void OnEntityAddNetworkInterfaceMenuItemClick(object sender, EventArgs e)

                          {

                                EntityTreeNode entityTreeNode = this.EntityContextMenu.Tag as EntityTreeNode;

                                if (entityTreeNode != null && entityTreeNode.Entity != null)

                                {

                                      NetworkInterfaceForm networkInterfaceForm = new NetworkInterfaceForm(null, entityTreeNode.Entity, this.StkRoot);

                                      if (networkInterfaceForm.ShowDialog() == DialogResult.OK)

                                      {

                                           NetworkInterface networkInterface = networkInterfaceForm.GetNetworkInterface();

                                           entityTreeNode.Entity.NetworkInterfaces.Add(networkInterface);

                                           entityTreeNode.InterfacesNode.Nodes.Add(new NetworkInterfaceTreeNode(networkInterface));

                                      }

                                }

                   }

② 【《NetworkInterfaceForm.cs》】的[ public NetworkInterface GetNetworkInterface() ]

源码如下:

               public NetworkInterface GetNetworkInterface()

               {

                     if (this.m_networkInterface == null)

                     {

                          this.m_networkInterface = new NetworkInterface(this.InterfaceName);

                     }

                     else

                     {

                          this.m_networkInterface.Name = this.InterfaceName;

                     }

                     IAgStkObject agStkObject = null;

                     if (this.transmitterInstanceNameCombo.SelectedIndex < 0)

                     {

                          IAgStkObject agStkObject2 = this.m_stkRoot.GetObjectFromPath(this.m_parentEntity.StkObjectPath.PathString);

                          if (this.useTransmitterSensor.Checked)

                          {

                                if (this.transmitterSensorCombo.SelectedIndex < 0)

                                {

                                      try

                                      {

                                           agStkObject = (agStkObject2 = agStkObject2.Children.New(AgESTKObjectType.eSensor, this.transmitterSensorCombo.Text));

                                           goto IL_B5;

                                      }

                                      catch

                                      {

                                           agStkObject2 = null;

                                           goto IL_B5;

                                      }

                                }

                                agStkObject2 = (this.transmitterSensorCombo.SelectedItem as ComboBoxItem).Item as IAgStkObject;

                          }

                          IL_B5:

                          try

                          {

                                if (agStkObject2 != null)

                                {

                                      IAgStkObject agStkObject3 = agStkObject2.Children.New(AgESTKObjectType.eAntenna, this.transmitterInstanceNameCombo.Text);

                                      this.m_networkInterface.TransmitAntennaStkPath = agStkObject3.Path;

                                }

                                goto IL_11E;

                          }

                          catch

                          {

                                goto IL_11E;

                          }

                     }

                     IAgStkObject agStkObject4 = (this.transmitterInstanceNameCombo.SelectedItem as ComboBoxItem).Item as IAgStkObject;

                     this.m_networkInterface.TransmitAntennaStkPath = agStkObject4.Path;

                     IL_11E:

                     if (this.useTransmitAntennaForReceiveCheckBox.Checked)

                     {

                          this.m_networkInterface.ReceiveAntennaStkPath = this.m_networkInterface.TransmitAntennaStkPath.PathString;

                     }

                     else

                     {

                          if (this.receiverInstanceNameCombo.SelectedIndex < 0)

                          {

                                IAgStkObject agStkObject5 = this.m_stkRoot.GetObjectFromPath(this.m_parentEntity.StkObjectPath.PathString);

                                if (this.useReceiverSensor.Checked)

                                {

                                      if (this.receiverSensorCombo.SelectedIndex < 0)

                                      {

                                           try

                                           {

                                                 if (agStkObject != null && this.receiverSensorCombo.Text.Equals(this.transmitterSensorCombo.Text))

                                                 {

                                                      agStkObject5 = agStkObject;

                                                 }

                                                 else

                                                 {

                                                      agStkObject5 = agStkObject5.Children.New(AgESTKObjectType.eSensor, this.receiverSensorCombo.Text);

                                                 }

                                                 goto IL_200;

                                           }

                                           catch

                                           {

                                                 agStkObject5 = null;

                                                 goto IL_200;

                                           }

                                      }

                                      agStkObject5 = (this.receiverSensorCombo.SelectedItem as ComboBoxItem).Item as IAgStkObject;

                                }

                                IL_200:

                                try

                                {

                                      if (agStkObject5 != null)

                                      {

                                           IAgStkObject agStkObject6 = agStkObject5.Children.New(AgESTKObjectType.eAntenna, this.receiverInstanceNameCombo.Text);

                                           this.m_networkInterface.ReceiveAntennaStkPath = agStkObject6.Path;

                                      }

                                      goto IL_26F;

                                }

                                catch

                                {

                                      goto IL_26F;

                                }

                          }

                          IAgStkObject agStkObject7 = (this.receiverInstanceNameCombo.SelectedItem as ComboBoxItem).Item as IAgStkObject;

                          this.m_networkInterface.ReceiveAntennaStkPath = agStkObject7.Path;

                     }

                     IL_26F:

                     return this.m_networkInterface;

               }

③[AGI.StkQualnetObjectModel.NetworkInterface]类型的【[networkInterface]类成员变量】调试时,内部变量赋值情况

-                  networkInterface   {interface0}           AGI.StkQualnetObjectModel.NetworkInterface

                   AGI.StkQualnetObjectModel.ISTKQualNetMappingWriterInterface.RainOutagePercent    0.1          double

                   ChannelIndex        -1           int

+           IPv4Address  {169.0.0.0}    AGI.StkQualnetObjectModel.IPv4Address

+           IPv4SubnetMask       {255.255.255.0}       AGI.StkQualnetObjectModel.IPv4SubnetMask

                   IPv6Address         null        AGI.StkQualnetObjectModel.IPv6Address

                   IPv6SubnetMask   null        AGI.StkQualnetObjectModel.IPv6SubnetMask

+                 Id           {444ff6ea-ac23-472a-be0b-0e28797a73c8}      System.Guid

                   InterfaceId             -1           int

                   IsNodeExpanded   false        bool

                   IsSatelliteInterface  false        bool

                   Link       null        AGI.StkQualnetObjectModel.IConnection

                   Name      "interface0"           string

                   NameWithParent   "interface0"           string

                   NetworkProtocol  eIPv4      AGI.StkQualnetObjectModel.NetworkProtocolType

                   Parent     null        AGI.StkQualnetObjectModel.NetworkInterfaceList

                   PropertyChanged  null        System.ComponentModel.PropertyChangedEventHandler

                   QualNetInterfaceId               "-1"        string

+                 RainOutagePercent               {AGI.StkQualnetObjectModel.VariableDouble}   AGI.StkQualnetObjectModel.VariableDouble

+           ReceiveAntennaStkPath        {/Satellite/XL11/Antenna/antennaU1}       AGI.StkQualnetObjectModel.StkObjectPath

             STKReceiveAntennaPath       "/Application/STK/Scenario/StarlinkSimScenario/Satellite/XL11/Antenna/antennaU1" string

             STKTransmitAntennaPath     "/Application/STK/Scenario/StarlinkSimScenario/Satellite/XL11/Antenna/antennaU1" string

+                 Subcategory          {AGI.StkQualnetObjectModel.NetworkInterfaceSubcategory}           AGI.StkQualnetObjectModel.NetworkInterfaceSubcategory

+           TransmitAntennaStkPath      {/Satellite/XL11/Antenna/antennaU1}       AGI.StkQualnetObjectModel.StkObjectPath

+                 m_id       {AGI.StkQualnetObjectModel.VariableGuid}       AGI.StkQualnetObjectModel.VariableGuid

+                 m_idVariable         {AGI.StkQualnetObjectModel.VariableInterfaceId}             AGI.StkQualnetObjectModel.VariableInterfaceId

                   m_link    null        AGI.StkQualnetObjectModel.IConnection

                   m_name  "interface0"           string

                   m_parent              null        AGI.StkQualnetObjectModel.NetworkInterfaceList

+                 m_receiveAntennaPath         {AGI.StkQualnetObjectModel.VariableStkObjectPath}        AGI.StkQualnetObjectModel.VariableStkObjectPath

+                 m_transmitAntennaPath       {AGI.StkQualnetObjectModel.VariableStkObjectPath}        AGI.StkQualnetObjectModel.VariableStkObjectPath

+                 Static members                   

            AGI.StkQualnetUiControls.dll!AGI.StkQualnetUiControls.StkQualnetScenarioExplorer.OnEntityAddNetworkInterfaceMenuItemClick(object sender, System.EventArgs e) 253   C#

  1. 修改【反编译后重新编译报错的[AGI.StkQualnetObjectModel]】,并添加到[test_Client]解决方案,调整工程项目依赖顺序,编译成功:

[AGI.StkQualnetObjectModel]逆向后编译成功★ →修改【反编译后重新编译报错的[AGI.StkQualnetObjectModel]】,并添加到[test_Client]解决方案,调整工程项目依赖顺序,编译成功

★【反编译导出为 VS2019 项目】使用dnSpy v6.1.8 选择导出为 VS2019 项目

★【VS2022打开反编译导出的项目】打开反编译的[AGI.StkQualnetObjectModel] VS2019 项目,修改编译报错的地方,其实大概就是几类报错问题(之前还是心理惧怕,以为很多错误^_^);

★【VS2022修改[AGI.StkQualnetObjectModel]反编译后报错地方,编译成功】编译成功的代码打包备份在[ F:\WS_STK_use_Interop\AGI.StkQualnetObjectModelSTK11.6Exata插件,dnSpy逆向后重新编译成功^_^.zip ]〕  →  后来发现其实也可以用VS2015打开!!!

★【将修改报错完毕的[AGI.StkQualnetObjectModel]添加到[test_Client]解决方案,调整工程项目依赖顺序,编译成功】编译成功的代码打包备份在[ F:\WS_STK_use_Interop\test_Client【成功编译^_^添加[AGI.StkQualnetObjectModel]逆向工程之后】.zip]〕。

★★★★★【VS2022修改[AGI.StkQualnetObjectModel]反编译后报错地方,编译成功】

①(string)element.Attribute("min"); 未赋值报错问题;

源码文件: F:\WS_STK_use_Interop\AGI.StkQualnetObjectModel\AGI.StkQualnetObjectModel\QualnetXmlHelper.cs

                                               else if (text3.Equals("TEXT"))  // JSLS备注:  IPv6 地址格式

                                               {

                                                             // JSLS备注: 下面的 dnSpy 反编译源码  重新编译 报错

                                                             //(string)element.Attribute("min");

                                                             //(string)element.Attribute("max");

                                                             string strJSLS_min = (string)element.Attribute("min");

                                                             string strJSLS_max = (string)element.Attribute("max");

                                                             if (text.ToUpper().Contains("V6-ADDRESS"))  // JSLS备注:  IPv6 地址格式

                                                             {

                                                                           if (text5.Length == 0)

                                                                           {

                                                                                         text5 = "2000::";   // JSLS备注:  IPv6 地址格式

                                                                           }

                                                                           result = new VariableIPv6Address(text2, text, text7, flag2, text6, text9, text8, optional, text5);

                                                             }

                                                             else

                                                             {

                                                                           result = new VariableString(text2, text, text7, flag2, text6, text9, text8, optional, text5);

                                                             }

                                               }

② using(){ while() } 改为 foreach() 迭代问题;

源码文件:F:\WS_STK_use_Interop\AGI.StkQualnetObjectModel\AGI.StkQualnetObjectModel\Scenario.cs

                   // Token: 0x060003D1 RID: 977 RVA: 0x00010A18 File Offset: 0x0000EC18

                   public static void ImportFromStkScenario(AgScenario stkScenario, Scenario newScenario)

                   {

                                 newScenario.StkRoot = (stkScenario.Root as AgStkObjectRoot);

                                 foreach (object obj in stkScenario.Children)

                                 {

                                               IAgStkObject agStkObject = (IAgStkObject)obj;

                                               Entity entity;

                                               if (agStkObject.ClassType == AgESTKObjectType.eMissileSystem)

                                               {

                    // JSLS备注: 下面的 dnSpy 反编译原始代码,报错!

                    // 【错误  CS1674  “IEnumerator”: using 语句中使用的类型必须可隐式转换为“System.IDisposable”     AGI.StkQualnetObjectModel        D:\Intel\11111\AGI.StkQualnetObjectModel\Scenario.cs】

                    //using (IEnumerator enumerator2 = agStkObject.Children.GetEnumerator())

                    // JSLS分析:查看阅读 STK 编程帮助文档, STK编程中, foreach() 迭代方式用得多一些!

                    //                  using (IEnumerator enumerator2 = agStkObject.Children.GetEnumerator()) 

                    //   加上           while (enumerator2.MoveNext())

                    // 实际上应该就是【 foreach(IAgStkObject obj2 in iagObjectItems) 】迭代方式?

                    IAgStkObjectCollection iagObjectItems = agStkObject.Children;

                    foreach(IAgStkObject obj2 in iagObjectItems)

                                                             {

                                                                           //while (enumerator2.MoveNext())

                                                                           //{

                                                                                         //object obj2 = enumerator2.Current;

                                                                                         IAgStkObject stkObject = (IAgStkObject)obj2;

                                                                                         entity = Scenario.CreateEntityFromStkObject(newScenario, stkObject);

                                                                                         if (entity != null && entity != null)

                                                                                         {

                                                                                                       newScenario.Hierarchy.Entities.Add(entity);

                                                                                         }

                                                                           //}

                                                                           //continue;

                                                             }

                                               }

                                               entity = Scenario.CreateEntityFromStkObject(newScenario, agStkObject);

                                               if (entity != null && entity != null)

                                               {

                                                             newScenario.Hierarchy.Entities.Add(entity);

                                               }

                                 }

                   }

③ yield return 问题;

源码文件: F:\WS_STK_use_Interop\AGI.StkQualnetObjectModel\AGI.StkQualnetObjectModel\Node.cs

                   // Token: 0x060002EC RID: 748 RVA: 0x00009D26 File Offset: 0x00007F26

                   public IEnumerator<Element> GetDepthFirstEnumerator()

                   {

                                 yield return this.mData;

                                 foreach (Node<Element> node in this.mChildren)

                                 {

                                               IEnumerator<Element> kidenumerator = node.GetDepthFirstEnumerator();

                                               while (kidenumerator.MoveNext())

                                               {

                                                             // 下面 dnSpy 反编译的代码 重新编译报错

                                                             //!0! = kidenumerator.Current;

                                                             //yield return !;

                                                             // JSLS备注:不知道这个逻辑对不对?

                                                             this.mData = kidenumerator.Current;

                                                             yield return this.mData;

                                               }

                                               kidenumerator = null;

                                 }

                                 IEnumerator<Node<Element>> enumerator = null;

                                 yield break;

                                 yield break;

                   }

④ < PrivateImplementationDetails >.ComputeStringHash(type) 密封类问题;

源码文件: F:\WS_STK_use_Interop\AGI.StkQualnetObjectModel\AGI.StkQualnetObjectModel\QualNetAppConfigWriter.cs

                   // JSLS备注: 【 < PrivateImplementationDetails > 】应该是个密封类, 修改名字为【 [JSLS_XiaoYuHao__PrivateImplementationDetails__JSLS_DaYuHao] 】

                   internal sealed class JSLS_XiaoYuHao__PrivateImplementationDetails__JSLS_DaYuHao

                   {

                   // Token: 0x06000759 RID: 1881 RVA: 0x0001D0CC File Offset: 0x0001B2CC

                                 internal static uint ComputeStringHash(string s)

                                 {

                                               uint num = 0U;

                                               if (s != null)

                                               {

                                                             num = 2166136261U;

                                                             for (int i = 0; i < s.Length; i++)

                                                             {

                                                                           num = ((uint)s[i] ^ num) * 16777619U;

                                                             }

                                               }

                                               return num;

                                 }

                   }

     // Token: 0x0600030A RID: 778 RVA: 0x0000A01C File Offset: 0x0000821C

     public bool Write()

                   {

                                 if (this.m_scenario.Connections.Applications.Count > 0 && !File.Exists(this.FilePath))

                                 {

                                               try

                                               {

                                                             this.m_writer = File.CreateText(this.FilePath);

                                                             this.m_writer.AutoFlush = true;

                                                             foreach (NetworkApplication networkApplication in this.m_scenario.Connections.Applications)

                                                             {

                                                                           this.WriteFormattedString("{0} {1} {2} ", new object[]

                                                                           {

                                                                                         networkApplication.Type,

                                                                                         networkApplication.Source.NodeId,

                                                                                         networkApplication.Destination.NodeId

                                                                           });

                                                                           string type = networkApplication.Type;

                                                                           // JSLS备注: 【 < PrivateImplementationDetails > 】应该是个密封类, 修改名字为【 [JSLS_XiaoYuHao__PrivateImplementationDetails__JSLS_DaYuHao] 】

                                                                           //uint num = < PrivateImplementationDetails >.ComputeStringHash(type);

                                                                           uint num = JSLS_XiaoYuHao__PrivateImplementationDetails__JSLS_DaYuHao.ComputeStringHash(type);

                                                                           if (num <= 2037514399U)

                                                                           {

                                                                                         if (num <= 893884390U)

                                                                                         {

                                                                                                       if (num != 563683786U)

                                                                                                       {

                                                                                                                     if (num != 570659453U)

                                                                                                                     {

                                                                                                                                   if (num == 893884390U)

                                                                                                                                   {

                                                                                                                                                 if (type == "CBR")

                                                                                                                                                 {

                                                                                                                                                               this.WriteCBR(networkApplication);

                                                                                                                                                 }

                                                                                                                                   }

                                                                                                                     }

                                                                                                                     else if (type == "TELNET")

⑤ ★★ Func<T, TResult>() 委托类型函数声明问题;

源码文件: F:\WS_STK_use_Interop\AGI.StkQualnetObjectModel\AGI.StkQualnetObjectModel\QualnetConfigFileMapping\ConfigFileInfo.cs

                        #region JSLS备注: 【 Func<NodeInfo, bool> 委托名称 】,表示输入为[NodeInfo]类型、输出为[bool]类型,名字叫[委托名称]的委托!

                        /*

                        以下示例所演示的那样将 lambda 表达式分配给 Func<T, TResult>委托。

                        using System;

                        public class LambdaExpression

                        {

                           public static void Main()

                           {

                              Func<string, string> convert = s => s.ToUpper();

                              string name = "Dakota";

                              Console.WriteLine(convert(name));  

                           }

                        }

                        */

                        #endregion JSLS备注: 【 Func<NodeInfo, bool> 委托名称 】,表示输入为[NodeInfo]类型、输出为[bool]类型,名字叫[委托名称]的委托!

                        //Func<NodeInfo, bool> <>9__1;

                        // JSLS备注: 声明一个 目前为空的【委托】

                        //             参考:VS2010帮助《Func<TResult> 委托》

                        #region 参考 VS2010帮助《Func<TResult> 委托》  中  的最后一个例子

                        /*

using System;

static class Func1

{

   public static void Main()

   {

      // Note that each lambda expression has no parameters.

      LazyValue<int> lazyOne = new LazyValue<int>(() => ExpensiveOne());

      LazyValue<long> lazyTwo = new LazyValue<long>(() => ExpensiveTwo("apple"));

      Console.WriteLine("LazyValue objects have been created.");

      // Get the values of the LazyValue objects.

      Console.WriteLine(lazyOne.Value);

      Console.WriteLine(lazyTwo.Value);

   }

   static int ExpensiveOne()

   {

      Console.WriteLine("\nExpensiveOne() is executing.");

      return 1;

   }

   static long ExpensiveTwo(string input)

   {

      Console.WriteLine("\nExpensiveTwo() is executing.");

      return (long)input.Length;

   }

}

class LazyValue<T> where T : struct

{

   private Nullable<T> val;

   private Func<T> getValue;

   // Constructor.

   public LazyValue(Func<T> func)

   {

      val = null;

      getValue = func;

   }

   public T Value

   {

      get

      {

         if (val == null)

            // Execute the delegate.

            val = getValue();

         return (T)val;

      }

   }

}

                        */

                        #endregion 参考 VS2010帮助《Func<TResult> 委托》  中  的最后一个例子

                        Func<NodeInfo, bool> JSLSdebug__DaYuXiaoYu9__1 = new Func<NodeInfo, bool>( (nodeInfo) => (false) );

                        // 【空委托】的写法: 右箭头的 左边 [nodeInfo] 表示输入类型为[NodeInfo]的形参,右箭头的 右边[false] 表示 委托函数实现时返回 bool 类型的 值 false 。

                        //Func<NodeInfo, bool> <>9__3;

                        Func<NodeInfo, bool> JSLSdebug__DaYuXiaoYu9__3 = new Func<NodeInfo, bool>( (nodeInfo) => (false) );

                        // 【空委托】的写法: 右箭头的 左边 [nodeInfo] 表示输入类型为[NodeInfo]的形参,右箭头的 右边[false] 表示 委托函数实现时返回 bool 类型的 值 false 。

                                                                                    foreach (string text2 in match.Value.Substring(num2 + 1, num3 - num2 - 1).Split(new char[]

                                                                                    {

                                                                                                  ','

                                                                                    }))

                                                                                    {

                                                                                                  List<string> list3 = new List<string>();

                                                                                                  if (text2.ToUpper().Contains("THRU"))

                                                                                                  {

                                                                                                                string text3 = text2.ToUpper();

                                                                                                                int num4 = text3.IndexOf('T');

                                                                                                                int num5 = text3.IndexOf('U');

                                                                                                                string s = text3.Substring(0, num4 - 1).Trim();

                                                                                                                string s2 = text3.Substring(num5 + 1).Trim();

                                                                                                                int num6;

                                                                                                                int.TryParse(s, out num6);

                                                                                                                int num7;

                                                                                                                int.TryParse(s2, out num7);

                                                                                                                for (int j = num6; j <= num7; j++)

                                                                                                                {

                                                                                                                              list3.Add(j.ToString());

                                                                                                                }

                                                                                                  }

                                                                                                  else

                                                                                                  {

                                                                                                                list3.Add(text2);

                                                                                                  }

                                                                                                  foreach (string text4 in list3)

                                                                                                  {

                                                                                                                bool flag = false;

                                                                                                                string trimmedCurId = text4.Trim();

                                                                                                                long num8 = long.Parse(trimmedCurId);

                                                                                                                string pattern4 = string.Format(ConfigFileInfo.s_satelliteNodeSearchPattern, trimmedCurId);

                                                                                                                if (Regex.Match(configText, pattern4).Success)

                                                                                                                {

                                                                                                                              IEnumerable<NodeInfo> nodeInfo = this.m_nodeInfo;

                                                                                                                              Func<NodeInfo, bool> predicate;

                                    // 假如 predicate 委托函数  为空的话

                                    if ((predicate = /*<>9__1*/ JSLSdebug__DaYuXiaoYu9__1) == null)

                                                                                                                              {

                                                                                                                                            predicate = (/*<>9__1*/ JSLSdebug__DaYuXiaoYu9__1 = ((NodeInfo n) => n.Subnet.Equals(subnet) && n.IsSatellite));

// JSLS备注: 【 Func<NodeInfo, bool> 委托名称 】,表示输入为[NodeInfo]类型、输出为[bool]类型,名字叫[委托名称]的委托!

/*

以下示例所演示的那样将 lambda 表达式分配给 Func<T, TResult>委托。

using System;

public class LambdaExpression

{

    public static void Main()

    {

        Func<string, string> convert = s => s.ToUpper();

        string name = "Dakota";

        Console.WriteLine(convert(name));  

    }

}

*/

                                    }

                                    if (new List<NodeInfo>(nodeInfo.Where(predicate)).Count == 0)

                                                                                                                              {

                                                                                                                                            flag = true;

                                                                                                                              }

                                                                                                                }

★★★★★【将修改报错完毕的[AGI.StkQualnetObjectModel]添加到[test_Client]解决方案,调整工程项目依赖顺序,编译成功】

重点需要注意:

①被依赖项目编译后 *.dll 输出目录设置问题:具体在【某个工程项目】右键 属性 生成 输出 将【输出路径】设置为 STK11.6 Exata .Net DLL组件插件目录位置,即【[ C:\Program Files\AGI\STK 11\STK-QualNet Interface\ ]

②项目依赖设置问题:特别注意,不仅要右键‘解决方案’选择[项目依赖项][项目生成顺序]进行设置;而且,还要记得,对‘每个具体的工程项目’再右键选择[生成依赖项][项目依赖项][项目生成顺序]进行设置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3019412.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

check startup检查各种资源文件

check startup 命令功能 check startup命令用来检查各种资源文件&#xff08;paf文件、补丁包、启动软件、配置文件&#xff09;是否正确。 命令格式 check startup [ crc ] [ next ] 参数说明 参数参数说明取值 crc 对资源文件进行CRC校验。 - next 检查下一次启动的各…

scitb5函数2.1版本(交互效应函数P for interaction)发布----用于一键生成交互效应表、森林图

写在前面的话&#xff0c;此函数不适用于NHANES数据&#xff0c;也不能用于COX回归,请注意甄别。 在SCI文章中&#xff0c;交互效应表格&#xff08;通常是表五&#xff09;几乎是高分SCI必有。因为增加了亚组人群分析&#xff0c;增加了文章的可信度&#xff0c;能为文章锦上添…

规培报名身份证上传怎么小于500k?这几个方法试试看

大家都知道在规培报名的时候&#xff0c;是需要上传一些自己的个人信息资料到平台上的&#xff0c;其中身份证照片是比较重要的一项&#xff0c;我们自己拍的身份证照片大小有时候可能不符合网站的规定&#xff0c;需要去做一些图片修改调整&#xff0c;比如图片你压缩&#xf…

OpenAI潜入黑客群聊!盗用ChatGPT被换成“喵喵GPT”,网友:绝对的传奇

当ChatGPT被**黑客“入侵”**时&#xff0c;OpenAI会如何应对&#xff1f; 掐断API&#xff0c;不让他们用&#xff1f;不不不。 这帮极客们采取的做法可谓是剑走偏锋——反手一记《无间道》。 故事是这样的。 OpenAI虽然在发布ChatGPT之前做了大量的安全性检测&#xff0c;…

基于FPGA的数字信号处理(10)--定点数的舍入模式(1)四舍五入round

1、前言 将浮点数定量化为定点数时&#xff0c;有一个避不开的问题&#xff1a;某些小数是无法用有限个数的2进制数来表示的。比如&#xff1a; 0.5(D) 0.1(B) 0.1(D) 0.0001100110011001~~~~(B) 可以看到0.5是可以精准表示的&#xff0c;但是0.1却不行。原因是整数是离散的…

物流EDI:GEFCO EDI 需求分析

GEFCO专注于汽车物流领域近70年&#xff0c;是欧洲整车市场的物流供应商&#xff0c;也是欧洲十大领先的运输和物流集团之一。GEFCO的业务遍及六大洲&#xff0c;业务覆盖150个国家&#xff0c;在全球拥有庞大的员工队伍&#xff0c;在全球汽车行业的挑战中茁壮成长。为汽车制造…

如何通过 4 种方式在 Mac 上恢复未保存的 Excel 文件

您曾在 MacBook 上花费数小时处理 Excel 工作簿&#xff0c;但现在它消失了。或者&#xff0c;当您退出 Excel 文件时&#xff0c;您无意中选择了“不保存”。这是不是说你所有的努力都白费了&#xff1f;本文系统地介绍了如何在 Mac 上恢复丢失的 Excel 文件。通过我们的 4 种…

响应式编程Spring Reactor探索

一&#xff0c;介绍 响应式编程&#xff08;Reactive Programming&#xff09;&#xff0c;简单来说是一种生产者只负责生成并发出数据/事件&#xff0c;消费者来监听并负责定义如何处理数据/事件的变化传递方式的编程思想。 响应式编程借鉴了Reactor设计模式&#xff0c;我们…

孩子用什么样的灯对眼睛没有伤害?分享多款满分护眼台灯

为人父母以后&#xff0c;深感压力山大。如今不仅要抓孩子的学习&#xff0c;还得时刻关注孩子的身心健康&#xff0c;尤其是视力问题。现在不少学生都存在近视的现象&#xff0c;而导致这一现象的主要原因&#xff0c;除了平时的学业压力过大以外&#xff0c;夜晚学习的光线也…

第二证券|为什么指数涨回来了钱没回来?

在a股市场上&#xff0c;常常会呈现指数涨回来了钱没回来的状况&#xff0c;呈现这种状况的原因如下&#xff1a; 1、大盘上涨是权重股所造成的 大盘上涨或许是受一些权重比较大的职业所影响&#xff0c;比方证券职业、钢铁职业、银行职业等等&#xff0c;这些职业的大涨&…

Progesterone(孕酮/黄体酮) ELISA检测试剂盒--3小时内可得到检测结果

孕酮&#xff08;Progesterone&#xff09;又称为黄体酮&#xff0c;是卵巢分泌的具有生物活性的主要孕激素&#xff0c;负责与生殖有关的活动&#xff0c;如乳房腺体发育、参与月经周期以及妊娠的建立和维持。此外&#xff0c;孕酮还参与支持妊娠期间的生理过程&#xff0c;包…

致远M3 log 敏感信息泄露漏洞

文章目录 免责漏洞描述漏洞原理影响版本漏洞复现修复方法 免责 只为学习与交流&#xff0c;若利用做一切违法乱纪的事与本人无关 漏洞描述 致远M3是一个企业移动业务管理平台&#xff0c;全面覆盖各种工作场景&#xff0c;通过智能化的办公和业务场景融合&#xff0c;为企业…

Cloudera的简介及安装部署

简介 Cloudera是一家位于美国的软件公司&#xff0c;成立于2008年&#xff0c;专注于为企业客户提供基于Apache Hadoop的软件、支持、服务以及培训。Cloudera的开源Apache Hadoop发行版&#xff0c;即Cloudera Distribution including Apache Hadoop&#xff08;CDH&am…

Linux中的软连接和硬链接

一、软和硬链接连接 在Linux系统中&#xff0c;软连接&#xff08;符号链接&#xff09;和硬链接是文件系统中两种不同类型的链接&#xff0c;它们用于创建对文件的引用。下面详细解释这两种链接的特点和区别&#xff1a;、 软连接&#xff08;符号链接&#xff09; 定义&…

项目解决方案:多台poe摄像机接到3台NVR上,如何进行统一管理

目录 一、概述 二、建设目标及需求 三、设计依据与设计原则 1、先进性与适用性 2、经济性与实用性 3、可靠性与安全性 4、开放性 5、可扩充性 6、追求最优化的系统设备配置 7、提高监管力度与综合管理水平 四、建设方案设计 &#xff08;一&#xff09;系统方案设计…

旋转矩阵(将坐标轴旋转)

旋转矩阵&#xff08;将坐标轴旋转&#xff09; 在二维空间中&#xff0c;旋转可以用一个单一的角 定义。作为约定&#xff0c;正角表示逆时针旋转。把笛卡尔坐标的列向量关于原点逆时针旋转的矩阵是&#xff1a; 原坐标系下 坐标系逆时针旋转β 补充 sin(-a) -sin(a) co…

超越Scratch的梦 用心打造商业系统图形编程体验

在一个阳光明媚的上午&#xff0c;卧龙和凤雏正在公司会议室激烈地讨论着图形化编程产品在商业系统开发中的应用和改进。会议室里摆放着一些电脑和投影仪&#xff0c;方便他们展示和演示相关的内容。 “你知道图形化编程在商业系统开发中没有被广泛应用的原因吗&#xff1f;”卧…

【JavaEE精炼宝库】计算机是如何工作的

目录 前言&#xff1a; 一、冯诺依曼体系 二、CPU基本知识 2.1 硬盘|内存|CPU关系&#xff1a; 2.2 指令&#xff1a; 2.3 CPU是如何执行指令的&#xff08;重点&#xff09;&#xff1a; 2.4 小结&#xff1a; 三、编程语言 3.1 程序&#xff1a; 3.2 编程语言发展&a…

Jmeter性能测试(四)

一、遇到问题解决思路 1、检查请求头是否正确 2、检查请求参数是否正确 3、检查鉴权信息是否正确 4、检查变量作用域 5、检查数据提取是否正确(正则/json提取器) 二、请求头检查 1、在Http信息头管理器查看 2、注意这里的变量作用域是全局的 三、请求参数检查 1、在查看结…

Agent AI智能体:塑造未来社会的智慧力量

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f916; Agent AI智能体&#xff1a;塑造未来社会的智慧力量&#x1f3af; 引言&#x1f331; 智能体的未来角色预览&#x1f4bc; 行业革新者&#x1f31f; 创意合作者&#x1f6e1;️ 公共安全与环保&#x1f680; …