Как выбрать "Объект запуска" в свойствах проекта, когда список пуст?
У меня есть проект WPF, который я пытаюсь сделать из него единичным приложением, используя рецепт с Microsoft.VisualBasic dll, описанный Дейлом Раганом здесь, в Stackru
Это делает в Visual Studio 2013 с Framework 4.5 двойную ошибку при компиляции: "... определено более одной точки входа..." для каждой точки входа. Тогда я решил, что увижу обе точки входа в параметрах comboBox моего элемента "Startup Object" на вкладке "Application" в свойствах моего проекта. Но это пусто. Почему comboBox "StartUp object" пуст и как установить точку входа? Может ли это быть ошибкой Microsoft?
Дополнительная информация: - 2 файла с точками входа: "App.g.cs" (автоматически сгенерированный) и мой новый определенный класс с точкой входа - основной: "EntryPoint.cs"
7 ответов
Извините, ребята,
Проблема исчезла. Я перезапустил Visual Studio, но у меня было такое же поведение. Я сделал новый проект для отправки в Microsoft в качестве ошибки, но он работал нормально. Затем я скопировал мой класс запуска из моего тестового проекта, и ошибка исчезла????????? Я не понимаю
Я решил проблему, взломав файл csproj:
<PropertyGroup>
<StartupObject>Test.Program</StartupObject>
</PropertyGroup>
Вы можете выполнить следующие действия (для EntryPoint):
- Щелкните правой кнопкой мыши свое решение, Свойства, Общие свойства, Startup Project и выберите там свой Startup Project.
- Откройте ваш app.xaml и установите StartUpUri в свой основной XAML-файл.
- Выгрузите ваш WPF-проект и после этого отредактируйте его!
В файле App.xaml.cs вы можете поместить следующие строки кода:
using System.Diagnostics;
...
Process[] activeProcess = Process.GetProcessByName(Process.GetCurrentProcess().ProcessName);
if (activeProcess.Length == 1)
{
Application.Run(new YOUR_MAIN_XAML_CLASS_HERE());
}
else
{
MessageBox.Show("You already have an instance of this program");
}
Надеюсь, поможет
Трудно предсказать, не просматривая код. Тем не менее, убедитесь, что следующие пункты покрыты.
Создайте класс, производный от Microsoft.VisualBasic.ApplicationServices
,WindowsFormsApplicationBase
и использовать его, чтобы обернуть ваш WPF System.Windows.Application
, Оболочка инициализируется путем предоставления вашей собственной реализации Main
,
namespace SingleInstanceNamespace
{
using System;
using System.Windows;
using Microsoft.VisualBasic.ApplicationServices;
public class SingleInstanceManager : WindowsFormsApplicationBase
{
public SingleInstanceManager()
{
this.IsSingleInstance = true;
}
protected override bool OnStartup(
Microsoft.VisualBasic.ApplicationServices.StartupEventArgs eventArgs)
{
base.OnStartup(eventArgs);
App app = new App(); //Your application instance
app.Run();
return false;
}
protected override void OnStartupNextInstance(
StartupNextInstanceEventArgs eventArgs)
{
base.OnStartupNextInstance(eventArgs);
string args = Environment.NewLine;
foreach (string arg in eventArgs.CommandLine)
{
args += Environment.NewLine + arg;
}
string msg = string.Format("New instance started with {0} args.{1}",
eventArgs.CommandLine.Count,
args);
MessageBox.Show(msg);
}
}
}
Следующий блок кода детализирует содержание App.cs
файл, в котором определена основная точка входа приложения:
namespace SingleInstanceNamespace
{
public class MyApp
{
[STAThread]
public static void Main(string[] args)
{
//Create our new single-instance manager
SingleInstanceManager manager = new SingleInstanceManager();
manager.Run(args);
}
}
}
В моем случае формы также отсутствовали в раскрывающемся списке объектов автозагрузки. Итак, я нашел другой простой способ изменить форму запуска.
- Открой
Program.cs
файл в представлении кода - Перейти к
static void Main()
- Измените строку, которая выглядит следующим образом:
Application.Run(new Form1());
На желаемую форму, как это: Application.Run(new BootloaderDialog());
Надеюсь это поможет!
В моем случае я записал имя записи Main() в main(), затем эта запись не была добавлена в список объектов запуска. Когда я изменил его на Main(), запись была добавлена в список объектов запуска. Так что будьте осторожны с учетом регистра.
Я хотел, чтобы «MyMainWindow» был начальным элементом для проекта «MyProject».
В App.xaml нужно было установить:
<Application x:Class="MyProject.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyProject"
StartupUri="MyMainWindow.xaml">
<Application.Resources>
</Application.Resources>