2013-10-25 180 views
0

我正在嘗試創建一個控制檯或窗體,將文件拖放到它們各自的.exe上 程序將獲取該文件並對其進行散列,然後將剪貼板文本設置爲可靠生成的散列。從命令行參數獲取散列

這是我的代碼

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Security.Cryptography; 
using System.Windows.Forms; 
using System.IO; 

namespace ConsoleApplication1 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     string path = args[0];   
     StreamReader wer = new StreamReader(path.ToString()); 
     wer.ReadToEnd(); 
     string qwe = wer.ToString(); 
     string ert = Hash(qwe); 
     string password = "~" + ert + "~"; 
     Clipboard.SetText(password); 
    } 

    static public string Hash(string input) 
    { 
     MD5 md5 = MD5.Create(); 
     byte[] inputBytes = Encoding.ASCII.GetBytes(input); 
     byte[] hash = md5.ComputeHash(inputBytes); 
     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < hash.Length; i++) 
     { 
      sb.Append(hash[i].ToString("X2")); 
     } 
     return sb.ToString(); 
    } 
} 
} 

當我得到釋放的單個.exe,以及將文件拖放到它,我得到某種線程錯誤 - 我不能提供它,因爲它是在控制檯中,不在vb2010中。感謝您的幫助

+0

如果你只是從*控制檯運行程序*,剛好路過的文件名作爲參數,會發生什麼?這樣你應該得到完整的堆棧跟蹤,你可以將它複製並粘貼到問題中。請注意,您的代碼無論如何都是有缺陷的,因爲您不應該首先將它作爲字符串讀取 - 只需調用傳入流中的「ComputeHash」即可。 –

+0

@ Jon Skeet - 當然,你能回答嗎? – Dean

+0

那麼你堅持哪一點? –

回答

0

剪貼板API在內部使用OLE,因此只能在STA線程上調用。與WinForms應用程序不同,控制檯應用程序默認情況下不使用STA。

添加[STAThread]屬性Main

[STAThread] 
static void Main(string[] args) 
{ 
    ... 

就做什麼異常消息告訴你:

未處理的異常:System.Threading.ThreadStateException:當前線程必須 設置爲單線程單元( STA)模式之前,可以進行OLE呼叫。確保您的主要功能上標有STAThreadAttribute


清理你的程序了一下:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Security.Cryptography; 
using System.Windows.Forms; 

namespace HashToClipboard 
{ 
    class Program 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      string hexHash = Hash(args[0]); 
      string password = "~" + hexHash + "~"; 
      Clipboard.SetText(password); 
     } 

     static public string Hash(string path) 
     { 
      using (var stream = File.OpenRead(path)) 
      using (var hasher = MD5.Create()) 
      { 
       byte[] hash = hasher.ComputeHash(stream); 
       string hexHash = BitConverter.ToString(hash).Replace("-", ""); 
       return hexHash; 
      } 
     } 
    } 
} 

這有超過你的程序幾個優點:

  • 它並不需要加載整個文件到內存在同時
  • 如果文件包含非ASCII字符/字節,則返回正確的結果
  • 它會更短和更清潔的