2013-10-25 3 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-файл из релиза, и перетащить файл на него, я получаю какое-то резьб error- я не могу представить, потому что это в консоли, а не в 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
  • Это будет короче и чище
Смежные вопросы