要写一个跟第三方软件iFix通讯的功能,引用FixDataSystem,和microsoft.VisualBasic.
 下面这段代码在窗口程序和Console程序里都能正常运行,但是写到服务程序里,就无法运行,调试跟踪是在groups.Add("G1");这句,服务程序就崩溃了,哪位大侠帮忙看看什么原因?怎么修改?
           String ifix_label;
           IFixDataSystem FDS = Interaction.CreateObject("FixDataSystems.Intellution FD Data System Control", "") as FixDataSystems.IFixDataSystem;            IFixDataServerCollection dataServerCollection = FDS.DataServers as FixDataSystems.IFixDataServerCollection;
            Groups groups = FDS.Groups as FixDataSystems.Groups;
            
            groups.Add("G1");
            FixDataSystems.Group group = groups["G1"] as FixDataSystems.Group;
             
            FixDataSystems.DataItems dataItems = group.DataItems as FixDataSystems.DataItems;
            
            dataItems.Add(ifix_label);            FixDataSystems.DataItem dataitem1 = dataItems[ifix_label] as FixDataSystems.DataItem;
            dataitem1.Value = 12;
            group.Write();

解决方案 »

  1.   

    没什么不同,区别是服务是windows调用的,所以有一些约定,比如需要start stop方法
      

  2.   


    你好,我是在OnStart()里调用这段代码,我在窗口程序和Console程序里都试过,能正常运行,只有服务程序,造成运行这段,服务直接崩溃。
      

  3.   

    protected override void OnStart(string[] args)
            {
                server = new AsyncTcpServer(9010);
                server.Encoding = Encoding.Unicode;
                server.ClientConnected +=
                  new EventHandler<TcpClientConnectedEventArgs>(server_ClientConnected);
                server.ClientDisconnected +=
                  new EventHandler<TcpClientDisconnectedEventArgs>(server_ClientDisconnected);
                server.PlaintextReceived +=
                  new EventHandler<TcpDatagramReceivedEventArgs<byte[]>>(server_PlaintextReceived);
                
                server.Start();
                MSGHandler("TCP server has been started."+ server.Port+" \r\n", 100);
                scada_read("Fix32.ML.T1.F_CV");
                
            }public void scada_read(string ifix_label)
            {
                //读取iFix变量
                //MSGHandler("12343241"+" \r\n", 100);
                IFixDataSystem FDS = Interaction.CreateObject("FixDataSystems.Intellution FD Data System Control", "") as FixDataSystems.IFixDataSystem;
                IFixDataServerCollection dataServerCollection = FDS.DataServers as FixDataSystems.IFixDataServerCollection;
                Groups groups = FDS.Groups as FixDataSystems.Groups;
                
                groups.Add("1");
                FixDataSystems.Group group = groups["1"] as FixDataSystems.Group;
                 
                FixDataSystems.DataItems dataItems = group.DataItems as FixDataSystems.DataItems;
                //MSGHandler(ifix_label+" \r\n", 100);
                dataItems.Add(ifix_label);            FixDataSystems.DataItem dataitem1 = dataItems[ifix_label] as FixDataSystems.DataItem;
                dataitem1.Value = 12;
                group.Write();
                //MSGHandler(dataitem1.Value+" \r\n", 100);
            }
      

  4.   

    OnStart方法有超时的,超时了不返回就认为服务启动失败了
      

  5.   

    没贴出错误,再贴代码也无济于事的。在windows日志中检查看看是否有错误记录。
      

  6.   

    2018/4/23 8:03:46System.Runtime.InteropServices.COMException (0x8004518A): 异常来自 HRESULT:0x8004518A
       在 FixDataSystems.IFixDataItemCollection.Add(String bstrName)
       在 CowBoy_SocketServer.CowBoy_SocketServer.scada_read(String ifix_label) 
      

  7.   

    凡是服务里使用就不能启动?从 window7开始,许多窗口程序中可用的机制都不能在服务会话下使用,这是“正常”的。你应该让这个COM组件的提供商输出更多更详细的日志,起码能看出更加具体的提示信息。最好是换做比较校准、靠谱的 .net 组件,特别是 .net framework 内部的现成的机制来编程,这样自己能把握一点点技术。