2018年7月9日 星期一

WindowService與WPF實作捕捉未做TryCatch的Exception方法

Window Service版本使用
using System.Security.Permissions;
using System.IO;

[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]
    protected override void OnStart(string[] args)
    {   AppDomain currentDomain = AppDomain.CurrentDomain;
        currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
        ...
        Your codes...
        ....
    }
    void MyHandler(object sender, UnhandledExceptionEventArgs args)
    {
        Exception e = (Exception)args.ExceptionObject;
        WriteToFile("Simple Service Error on: {0} " + e.Message + e.StackTrace);
    }
    private void WriteToFile(string text)
    {
        string path = "C:\\ServiceLog.txt";
        using (StreamWriter writer = new StreamWriter(path, true))
        {
            writer.WriteLine(string.Format(text, DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt")));
            writer.Close();
        }
    }


WPF版本使用



private void Application_DispatcherUnhandledException(object sender, 
                       System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    // Handle the exception
}

2018年4月10日 星期二

C# WPF TextBox Binding List

首先建立一個類別叫ListToTextConverter,程式碼如下。

    public class ListToTextConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            StringBuilder sb = new StringBuilder();
            foreach (string s in (List)value)
            {
                if(sb.Length != 0)
                {
                    sb.Append(",");
                }
                sb.Append(s);
            }

            return sb.ToString();
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string[] lines = ((string)value).Split(new string[] { @"\r\n" }, StringSplitOptions.RemoveEmptyEntries);
            return lines.ToList();
        }
    }


建立完成後,在View頁面上加入該類別,這樣才能引用,程式碼如下。

                
    
        
            
                
            
            
        
    
  
    
  



這樣就算完成引用了,當程式在執行時,在Binding過程當中,會執行到ListToTextConverter類別內執行Convert方法,並且轉換成字串,再給TextBox。

2018年1月5日 星期五

OPC 錯誤代碼 "800706BA"

像這樣的錯誤可能會產生連接或建議。它們表示無法連接到Windows遠程過程服務(RPCSS),原因可能是服務本身沒有運行或受損,或者防火牆阻止了連接。 使用Windows服務控制面板驗證Windows遠程過程服務是否在服務器計算機上運行(因為Windows實例管理器列表實際上在svchost.exe進程下運行,所以不能在最近的Windows版本中使用)。 netstat -a命令還應指出計算機正在偵聽端口135.如果看不到RPCSS正在運行,請驗證計算機上是否啟用了DCOM,然後重新啟動服務器。 如果RPCSS服務沒有明顯問題,則可能會阻止對端口135的訪問。如果服務器正在使用Windows防火牆,請將TCP端口135添加到防火牆例外列表中。 呼叫失敗意味著在發送提示數據時,OPC服務器無法與客戶端進行通信。除了在客戶端計算機上(PI OPC接口正在運行的地方),而不是在OPC服務器上,除了在advise調用上對RPC服務器故障進行故障排除之外,其它步驟與上述相同。還有一個額外的步驟。 OPC服務器和客戶端最初在端口135上進行通信,但是隨後他們將協商新的端口號以繼續對話。知識庫文章2973OSI8詳細討論了這個過程如何工作。簡短的版本是,您可能需要為一系列臨時端口添加防火牆例外。