我正在尝试编写在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());
}
}
}
}
答案 0 :(得分:0)
如果绕过参数检查并尝试在调试器中显示FBD,并使用此确切代码,您将看到 System.Threading.ThreadStateException:'当前线程必须设置为单线程单元(STA)模式才能进行OLE调用。确保您的Main函数上已标记STAThreadAttribute。仅当将调试器附加到进程时,才会引发此异常。'
根据错误消息,如果未附加调试器,则不会引发此异常。像在任何Windows窗体应用程序中通常看到的那样,在您的[STAThread]
方法上放置一个Main
属性:
[STAThread]
public static void Main(string[] args)
{
...
我还建议您在外部添加else
,以在没有传递参数的情况下显示错误(否则您的应用程序将以静默方式退出