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 中。谢谢你的帮助

4

1 回答 1

0

剪贴板 API 在内部使用 OLE,因此只能在 STA 线程上调用。与 WinForms 应用程序不同,控制台应用程序默认不使用 STA。

[STAThread]属性添加到Main

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

只需按照异常消息告诉您的操作:

未处理的异常: System.Threading.ThreadStateException: 当前线程必须设置为单线程单元 (STA) 模式才能进行 OLE 调用。确保您的 Main 函数已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;
            }
        }
    }
}

与您的程序相比,这有几个优点:

  • 它不需要同时将整个文件加载到 RAM 中
  • 如果文件包含非 ASCII 字符/字节,则返回正确的结果
  • 它会更短更干净
于 2013-10-25T21:31:30.363 回答