4

我有一个 WPF 项目,我尝试使用由 Dale Ragan在 StackOverflow描述的 Microsoft.VisualBasic dll 配方使其成为单实例应用程序

在带有 Framework 4.5 的 Visual Studio 2013 中这样做会在编译时给我 2 倍相同的错误:“......定义了多个入口点......”为每个入口点。然后我虽然我会在我的项目属性的“应用程序”选项卡的“启动对象”项的组合框选项中看到两个入口点。但它是空的。为什么“启动对象”组合框为空以及如何设置入口点?会不会是微软的错误?

附加信息: - 带有入口点的 2 个文件是“App.g.cs”(自动生成)和我新定义的带有入口点的类 - 主要:“EntryPoint.cs”

4

7 回答 7

9

我通过破解 csproj 文件解决了这个问题:

<PropertyGroup>
  <StartupObject>Test.Program</StartupObject>
</PropertyGroup>
于 2018-03-16T12:36:56.770 回答
4

对不起各位,

问题消失了。我重新启动了 Visual Studio,但我有同样的行为。我做了一个新项目作为错误发送给微软,但它工作正常。然后我从我的测试项目中复制了我的启动类,错误消失了????????? 我不明白。

于 2014-03-20T14:36:45.237 回答
1

您可以按照以下步骤操作(对于入口点):

  • 右键单击您的解决方案、属性、通用属性、启动项目,然后在此处选择您的启动项目。
  • 打开 app.xaml 并将 StartUpUri 设置为 Main 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");
}

希望能帮助到你

于 2014-03-20T14:10:38.127 回答
0

如果不查看代码,很难预测。但是,请确保涵盖以下几点。

创建一个派生自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);
        }
    }
}
于 2014-03-20T13:57:45.470 回答
0

就我而言,启动对象下拉列表中也缺少表单。因此,我找到了另一种修改启动表单的简便方法。

  1. Program.cs在代码视图中打开文件
  2. 前往static void Main()
  3. 修改如下所示的行:

Application.Run(new Form1());

到您想要的表格,如下所示:
Application.Run(new BootloaderDialog());

希望这可以帮助!

于 2019-05-03T20:50:22.160 回答
0

就我而言,我将条目名称 Main() 拼写为 main(),然后此条目未添加到启动对象列表中。当我将其更改为 Main() 时,该条目已添加到启动对象列表中。所以要小心区分大小写。

于 2019-08-13T08:25:31.493 回答
0

我希望“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>
于 2021-02-04T17:53:50.247 回答