如果没有Form,FolderBrowserDialog将不会显示在单个.cs文件中

时间:2019-05-01 20:13:57

标签: c# csc folderbrowserdialog

我正在尝试编写在Windows中右键单击文件时执行的程序,然后使用名为“移至”的上下文菜单功能在Windows注册表HKEY ClASSES中执行文件。它应该在执行时解析为“%1”作为参数,以便我的程序知道文件的位置。但是,当我编译单个.cs文件时,FolderBrowserDialog将不会显示。我怀疑这是因为我在调用它之前没有初始化某种形式。是否可以通过某种方式从单个c#文件中选择一个不包含表单的文件夹?

using System;
using System.IO;
using System.Reflection;
using System.Windows.Forms;


public class MoveTo : Form 
{

    public static string current_file_path;
    public static string new_file_path;
    public static string file_name;

    public static void Main(string[] args){
        if (args.Length > 0)
        {
            current_file_path = (string) args[0];
            file_name = (string) current_file_path.Replace(Path.GetDirectoryName(Environment.GetCommandLineArgs()[1]), "");
            var browser = new FolderBrowserDialog();

            if (browser.ShowDialog()==DialogResult.OK)
            {
                new_file_path = browser.SelectedPath + file_name;
            }else
            {
                Environment.Exit(1);
            }
            try
            {
                File.Move(current_file_path, new_file_path);    
            }catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }   
    }
}

1 个答案:

答案 0 :(得分:0)

如果绕过参数检查并尝试在调试器中显示FBD,并使用此确切代码,您将看到 System.Threading.ThreadStateException:'当前线程必须设置为单线程单元(STA)模式才能进行OLE调用。确保您的Main函数上已标记STAThreadAttribute。仅当将调试器附加到进程时,才会引发此异常。'

根据错误消息,如果未附加调试器,则不会引发此异常。像在任何Windows窗体应用程序中通常看到的那样,在您的[STAThread]方法上放置一个Main属性:

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

我还建议您在外部添加else,以在没有传递参数的情况下显示错误(否则您的应用程序将以静默方式退出