FolderBrowserDialog не будет отображаться в одном файле .cs без формы - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь закодировать программу, которая выполняется, когда файл щелкается правой кнопкой мыши в 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 голосов
/ 01 мая 2019

Если вы пропустите проверку аргумента и попытаетесь показать FBD в отладчике, с этим точным кодом вы увидите System.Threading.ThreadStateException: 'Текущий поток должен быть установлен в однопотоковый режим квартиры (STA) прежде чем OLE звонки могут быть сделаны. Убедитесь, что на вашей главной функции помечен атрибут STAThreadAttribute. Это исключение возникает только в том случае, если к процессу присоединен отладчик. '

Согласно сообщению об ошибке, это исключение не будет вызываться, если не подключен отладчик. Поместите атрибут [STAThread] в ваш метод Main, как вы обычно видите в любом приложении для форм Windows:

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

Я также рекомендую добавить else для внешнего if, чтобы показать ошибку, если не переданы аргументы (в противном случае ваше приложение будет молча завершать работу

...