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詳細討論了這個過程如何工作。簡短的版本是,您可能需要為一系列臨時端口添加防火牆例外。

2017年12月20日 星期三

C# WPF DataGrid DataGridTextColumn Cell Event

DataGrid加載事件

只要在DataGridTextColumn裡面加入DataGridTextColumn.EditingElementStyle就可以在裡面放入事件了
方法如下





-->


參考來源:Cell value changed event(?) in DataGrid

2017年11月7日 星期二

C# 加載網路硬碟的Dll失敗

我有一個網路硬碟,磁區符號是Z槽。

在Z槽下面,放了一個assembly,名為test.dll。然後,我在VS2010中建立了一個.NET 4.0的工程,程序中有下面一段代碼:

執行代碼,拋出FileLoadException異常:Could not load file or assembly 'file:///Y:\bb\nvo_cas.dll' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)。

【辦法一】

根據提示,找到了MSDN的一篇文章。文章給出的解決辦法是:在App.config中加入下面的xml片段:

      
      ......  
        
          
          
        
      ......  
      


【辦法二】

Assembly類有一個靜態函數UnsafeLoadFrom,這個函數在加載一個assembly的時候,不會進行一些安全檢查。

string dll = @"Z:\test.dll";  
Assembly a = Assembly.UnsafeLoadFrom(dll);  


【辦法三】

Assembly的load方法有很多的重載,可以使用其中的一個參數為byte[]的load函數。代碼如下:

string dll = @"Z:\test.dll"; ;  
byte[] assemblyBuffer = File.ReadAllBytes(dll);  
Assembly a = Assembly.Load(assemblyBuffer);  


轉載自:【解决问题】加载网络映射盘中的assembly失败

2017年9月28日 星期四

C# ObservableCollection 此類型的 CollectionView 不支援從 與發送器執行續不同的執行緒變更其SourceCollection

今天撰寫OPC Server遇到一個問題是 我的OPCServerSource已經跟UI的TreeView綁定了 可是我又透過OPC Client去取得Browser的Server的資料 再要將Server資料匯入到OPCServerSource時,出現如圖下的錯誤。



解決的方法是在要匯入的地方加入Application.Current.Dispatcher.BeginInvoke((Action)delegate () {};這行,就可以解決問題了

private void ServerBrowserItemsUI(List serverList)
{
  Application.Current.Dispatcher.BeginInvoke((Action)delegate ()
  {
    serverList.ToList().ForEach(args =>
    {
    OPCServerSource.Add(new Model.OPCServer() { ProgName = args.progID, ProgID = args.clsid.ToString(), Url = new System.Windows.Media.Imaging.BitmapImage(new Uri(@"/OPCDASettingWPFLib;component/Common/Images/lightIcon_green_20.png", UriKind.RelativeOrAbsolute)) });
    });
  });
}

2017年9月17日 星期日

混合模式組件是針對版本 v2.0.50727 的執行階段建置的,無法在沒有其他組態資訊的情況下載入 4.0 執行階段中。

小編今天撰寫OPC Server時,套用的Third Party是.NET Framework 2.0的版本 而公司採用的是.NET Framework 4.0的版本,所以出現了以下的錯誤。



根據網路上解決的方法是在App.Config裡面加入『useLegacyV2RuntimeActivationPolicy="true"』這行即可。