Можно ли использовать savefiledialog () в консольных приложениях Windows? - PullRequest
3 голосов
/ 08 марта 2012
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Diagnostics
{
    class Program
    {
        static void Main(string[] args)
        {
            string filename = null;
            using (SaveFileDialog sFile = new SaveFileDialog())
            {
                sFile.Filter = "Text (Tab delimited)(*.txt)|*.txt|CSV (Comma separated)(*.csv)|*.csv";
                if (sFile.ShowDialog() == DialogResult.OK)
                {
                    filename = sFile.FileName;
                    WriteRegKey(diagnostic, filename);
                }

            }
        }
    }
}

Я получаю ошибку: Не удалось найти тип или имя пространства имен 'SaveFileDialog' (отсутствует директива using или ссылка на сборку?)

Я попытался добавить пространство имен System.Windows.Forms, но не смог.

Ответы [ 4 ]

11 голосов
/ 08 марта 2012

Возможно, вам будет проще решить проблему и использовать приложение Windows Forms с консолью. Для этого создайте приложение Windows Forms в Visual Studio. Удалите форму по умолчанию, которую он создает. Откройте файл program.cs и удалите код, который пытается создать окно, и замените его кодом своего консольного приложения.

Теперь хитрость в том, что вам нужно вручную создать консоль. Вы можете сделать это с помощью этого вспомогательного класса:

public class ConsoleHelper
{
    /// <summary>
    /// Allocates a new console for current process.
    /// </summary>
    [DllImport("kernel32.dll")]
    public static extern Boolean AllocConsole();

    /// <summary>
    /// Frees the console.
    /// </summary>
    [DllImport("kernel32.dll")]
    public static extern Boolean FreeConsole();
}

Теперь в начале вашей программы (перед тем, как попробовать Console.Writeline's), вызовите

ConsoleHelper.AllocConsole(); 

И в самом конце вызова вашей программы

ConsoleHelper.FreeConsole();

Теперь у вас есть консольное приложение, которое может создавать диалоги WinForms, включая SaveFileDialog.

10 голосов
/ 08 марта 2012

Необходимо добавить ссылку на сборку System.Windows.Forms.

Кроме того, необходимо добавить атрибут STAThread в метод точки входа приложения.

[STAThread]
private static void Main(string[] args)
{
    using (SaveFileDialog sFile = new SaveFileDialog())
    {
        sFile.ShowDialog();
    }

    Console.ReadKey();
}

Но, честноЭто ужасная идея.Консольное приложение не должно иметь никакого другого пользовательского интерфейса, кроме самой консоли.Как предполагает пространство имен SaveFileDialog, SaveFileDialog следует использовать только для Forms.

1 голос
/ 08 марта 2012

В вашем коде не импортировано пространства имен System.Windows.Forms.

Вам необходимо добавить ссылку в System.Windows.Forms из * 1007Диалоговое окно «Добавить ссылку» .Затем вызовите пространство имен с использованием System.Windows.Forms (без кавычек) и создайте объект SaveFileDialog Class.

1 голос
/ 08 марта 2012

Вам нужно добавить ссылку на System.Windows.Forms в сам проект, а не в исходный файл. Щелкните правой кнопкой мыши значок проекта на панели инструментов Solution Explorer и выберите «Добавить ссылку».

...