Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 Программа не содержит статического метода "Main", подходящего для точки входа.  [new]
Michael Hopgarden
Member

Откуда: Russia, Moscow
Сообщений: 64
Пытаюсь начать проект на базе другого проекта. [img="https://drive.google.com/file/d/1Aj6bqJIhAmzvnZ5xahHsir2IGT0Pq7MO/view?usp=sharing"] Я что-то не то пишу в StartupUri, или проблема в чем то другом?
RiskHedging/App.xaml:
<Application x:Class="RiskHedging.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="pack://application:,,,/MainFrame;component/Views/MainWindow.xaml"
             Startup="App_OnStartup"
             Exit="App_OnExit"
             >
    <Application.Resources>
         
    </Application.Resources>
</Application>

P.S. И, подскажите другие живые русскоязычные форумы по C# и WPF.

К сообщению приложен файл. Размер - 7Kb
29 июл 19, 17:09    [21937050]     Ответить | Цитировать Сообщить модератору
 Re: Программа не содержит статического метода "Main", подходящего для точки входа.  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4031
StartupUri="pack://application:,,,/MainFrame;component/Views/MainWindow.xaml"
Startup="App_OnStartup"
на сколько я помню, можно использовать только один из этих параметров, либо 1, либо 2.
1 вызывает форму
2 вызываем метод из класс App
29 июл 19, 17:11    [21937057]     Ответить | Цитировать Сообщить модератору
 Re: Программа не содержит статического метода "Main", подходящего для точки входа.  [new]
Michael Hopgarden
Member

Откуда: Russia, Moscow
Сообщений: 64
B базовом проекте такое сочетание проблем не вызывало.
App.xaml:
+
<Application    x:Class="MainFrame.App"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                StartupUri="/Views/MainWindow.xaml"
                Startup="App_OnStartup"
                Exit="App_OnExit">
    <Application.Resources>
         
    </Application.Resources>
</Application>
App.xaml.cs
+
namespace MainFrame
{
   /// <summary>
   /// Логика взаимодействия для App.xaml
   /// </summary>
   public partial class App : Application
   {
      static App()
      {
         var resourceAssembly = Assembly.GetAssembly(typeof(App));
      }

      private void App_OnStartup(object sender, StartupEventArgs e)
      {
      }

      private void App_OnExit(object sender, ExitEventArgs e)
      {
         Store.Snapshot();
      }
   }
}

Здесь, как мне кажется, дело в другом. App.xaml в одном пространстве имен (и сборке), а MainWindow.xaml в другом. Вопрос. Можно ли так делать?
29 июл 19, 18:09    [21937152]     Ответить | Цитировать Сообщить модератору
 Re: Программа не содержит статического метода "Main", подходящего для точки входа.  [new]
Eld Hasp
Member

Откуда:
Сообщений: 308
Roman Mejtes
StartupUri="pack://application:,,,/MainFrame;component/Views/MainWindow.xaml"
Startup="App_OnStartup"
на сколько я помню, можно использовать только один из этих параметров, либо 1, либо 2.
1 вызывает форму
2 вызываем метод из класс App
Оба можно одновременно использовать.
Проверенно не раз.
Сначала отрабатывает Startup потом StartupUri
30 июл 19, 00:13    [21937366]     Ответить | Цитировать Сообщить модератору
 Re: Программа не содержит статического метода "Main", подходящего для точки входа.  [new]
Eld Hasp
Member

Откуда:
Сообщений: 308
Michael Hopgarden
Я что-то не то пишу в StartupUri, или проблема в чем то другом?

Это по вашему коду и скрину не определишь.
Нужны ваши пространства имён и в каких сборках они расположены.

Поступите проще. Перенесите создание и показ component/Views/MainWindow.xaml из StartupUri в метод App_OnStartup.
Это же всего две строчки кода. Зато гадать не придётся в чём проблема.
Michael Hopgarden
P.S. И, подскажите другие живые русскоязычные форумы по C# и WPF.

http://www.cyberforum.ru/wpf-silverlight/.
Значительно активнее, но.... Там в основном об элементарном. Почти все начинающие, студенты.
Здесь уровень экспертов гораздо выше.
30 июл 19, 00:22    [21937368]     Ответить | Цитировать Сообщить модератору
 Re: Программа не содержит статического метода "Main", подходящего для точки входа.  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6021
Michael Hopgarden
Здесь, как мне кажется, дело в другом. App.xaml в одном пространстве имен (и сборке), а MainWindow.xaml в другом. Вопрос. Можно ли так делать?

Можно, можно. Только StartupUri здесь дело пятое - если бы были проблемы с ним, то ошибки выглядели бы как-то так:
- при отсутствии сборки, в которой находится ресурс:

System.IO.FileNotFoundException: Could not load file or assembly MainFrame, Culture=neutral or one of its dependencies. The system cannot find the file specified.

- при отсутствии ресурса:

System.IO.IOException: Cannot locate resource views/mainwindow.xaml

Ошибка в заголовке темы исчерпывающе описывает причину - у запускаемой сборки отсутствует application entry point aka static void Main. И эта ошибка совсем не является специфичной для WPF. Но в WPF этот метод обычно не создают руками - он генерируется автоматически при сборке проекта. Декомпилированный App.xaml.cs выглядит как-то так:
using System;
using System.CodeDom.Compiler;
using System.Diagnostics;
using System.Globalization;
using System.Threading;
using System.Windows;
namespace wpftest
{
  public class App : Application
  {
    private void AppStartup(object sender, StartupEventArgs e)
    {
      Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
    }
    [GeneratedCode("PresentationBuildTasks", "4.0.0.0"), DebuggerNonUserCode]
    public void InitializeComponent()
    {
      base.Startup += new StartupEventHandler(this.AppStartup);
      base.StartupUri = new Uri("Window1.xaml", UriKind.Relative);
    }
    [GeneratedCode("PresentationBuildTasks", "4.0.0.0"), DebuggerNonUserCode, STAThread]
    public static void Main()
    {
      App app = new App();
      app.InitializeComponent();
      app.Run();
    }
  }
}

и чтобы в нем появились все те методы с атрибутами GeneratedCode и DebuggerNonUserCode, нужно, чтобы у App.xaml в свойствах файла было выставлено Build Action = ApplicationDefinition - скорее всего, в новом проекте эта штука слетела.
30 июл 19, 06:08    [21937410]     Ответить | Цитировать Сообщить модератору
 Re: Программа не содержит статического метода "Main", подходящего для точки входа.  [new]
Michael Hopgarden
Member

Откуда: Russia, Moscow
Сообщений: 64
Сон Веры Павловны
нужно, чтобы у App.xaml в свойствах файла было выставлено Build Action = ApplicationDefinition - скорее всего, в новом проекте эта штука слетела.
Свойство было выставлено, слетело, где то в другом месте.
Eld Hasp
Это по вашему коду и скрину не определишь.
Нужны ваши пространства имён и в каких сборках они расположены.

Поступите проще.
Сборки соответствуют корневым папкам на скрине. Пространства имен совпадают с именами папок.
Перенос в код не помог. Та же ошибка.

Помогло пересоздание проекта.

Вопрос. Правильно ли я вообще выбрал подход?
Foundation - сборка отвечающая за сериализацию свойств авторства poemmuse с хабра.
MainFrame - каркас GUI - основное окно с меню, и TabContol`ом и прочим, который можно будет использовать в других проектах.
RiskHedging - там, где планируется размещать Model, VewModel, и UserConrol`ы, которые размещать в TabItem в MainFrame/Views/MainWindow
Или же лучше (правилеьнее) создать наследника RiskHedging/Views/MainWindow от MainFrame/Views/MainWindow, а не создавать расширения для классов MainFrame в пространстве RiskHedging?
30 июл 19, 12:41    [21937772]     Ответить | Цитировать Сообщить модератору
 Re: Программа не содержит статического метода "Main", подходящего для точки входа.  [new]
Michael Hopgarden
Member

Откуда: Russia, Moscow
Сообщений: 64
И еще вопрос. Разве точка входа не должна быть единственной?
Т.к. если я удаляю из MainFrame или из RiskHedging любой из следующих файлов - App.xaml, MainWindow.xaml, то получаю ошибку об отсутствии метода Main. В результате в обоих пространствах у меня 2 одинаковых App.xaml и один не используемый MainWindow.xaml. И честно говоря, не понимаю где у меня точка входа.
30 июл 19, 15:06    [21937946]     Ответить | Цитировать Сообщить модератору
 Re: Программа не содержит статического метода "Main", подходящего для точки входа.  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6021
Michael Hopgarden
И еще вопрос. Разве точка входа не должна быть единственной?
Т.к. если я удаляю из MainFrame или из RiskHedging любой из следующих файлов - App.xaml, MainWindow.xaml, то получаю ошибку об отсутствии метода Main. В результате в обоих пространствах у меня 2 одинаковых App.xaml и один не используемый MainWindow.xaml. И честно говоря, не понимаю где у меня точка входа.

Точка входа - да, только одна. Классов с методами, сигнатура которых совпадает с сигнатурой метода точки входа - сколько угодно. Если таких методов больше одного, то:
If you have more than one class that has a Main method, you must compile your program with the /main compiler option to specify which Main method to use as the entry point. For more information, see /main (C# Compiler Options).

IDE задает этот флаг компилятора посредством передачи MSBuild элемента StartupObject (отдельный узел в .csproj-файле). В дизайнере свойств проекта этот элемент задается в поле Startup object на вкладке Application.
И если в сборке проекта приложения действительно живет несколько методов Main, а Startup object не указан, то проект просто не получится скомпилировать - будет ошибка компиляции "CS0017 Program has more than one entry point defined. Compile with /main to specify the type that contains the entry point."
30 июл 19, 17:52    [21938135]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить