.NET 应用程序将 运行 作为控制台应用程序而不是 Windows 表单,调试工作

.NET Application will run as a Console Application but not as Windows Forms, Debug Works

我有一个 Windows 应用程序,它以前在 .NET 2.0 上运行过一次,我只是想将它带到 .NET Framework 4 中。我之前已经这样做了数百次,没有任何问题。

长话短说: 升级后,我可以从调试和发布模式 运行 Windows 应用程序(用 C# 编写)。我的所有程序集都设置为构建目标 (x86),以确保任何 32 位依赖项都将 运行 on Windows 7 x64。奇怪的是,当我 运行 来自 bin\x86\Debug 或 Release 目录的可执行文件时,没有任何反应。完全没有。应用程序启动然后立即停止,并且没有错误消息、没有崩溃、没有写入事件日志的项目。它只是开始然后停止。

最疯狂的部分是,如果我将项目输出类型切换为 "Console Application",那么它可以从 exe 文件转换为 运行! (当它处于 运行ning 时,在应用程序的后面有一个烦人且丑陋的控制台 window)。

有没有人以前听过这样的事情?

以下是我尝试过的内容和更多信息:

有人见过这样的东西吗?我使用 C# 已经超过 14 年了,之前从未见过这种行为。

编辑:从 Program.cs 添加代码减去名称空间标记并使用语句

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        try
        {                
            MessageBox.Show("Start");
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
            MessageBox.Show("End");
        }
        catch (Exception exp)
        {
            ExceptionDisplay.LaunchUnexpected(exp);
        }
    }
}

ExceptionDisplay class 只是一个简单的 windows 表单,用于显示和报告意外错误。在这种情况下,try / catch 块是否存在并不重要。可执行文件也会发生相同的行为。

编辑:在调试模式下添加退出代码

The thread 'vshost.RunParkingWindow' (0xf70) has exited with code 0 (0x0).
The thread '<No Name>' (0x25c0) has exited with code 0 (0x0).
The program '[13496] MyProgram.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).

编辑:从 .csproj 文件添加 PropertyGroup 项目

<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{C5FE7F9D-57BB-4A6F-AD53-43BE99BAB6CF}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MyNamespace</RootNamespace>
<AssemblyName>MyAssemblyName</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<FileUpgradeFlags>
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>3.5</OldToolsVersion>
<TargetFrameworkProfile />
<IsWebBootstrapper>true</IsWebBootstrapper>
<PublishUrl>http://localhost/MyNamespace/</PublishUrl>
<Install>true</Install>
<InstallFrom>Web</InstallFrom>
<UpdateEnabled>true</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>security.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<SignAssembly>true</SignAssembly>
</PropertyGroup>
<PropertyGroup>
<AssemblyOriginatorKeyFile>company.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>

更新: 我尝试将所有文​​件从一个项目移动到另一个新项目,在我编译它之后,exe 文件就可以运行了。然后,在准备部署时,我对项目做了一些事情(包括使用强名称签名、更改程序图标等),然后 exe 停止工作。在将范围缩小到我执行的最新事件序列之后,我一次切换了最近更改的每个项目,并发现导致 exe 无法构建的项目正在设置 非默认图标

如果我将默认图标切换为 .ico 文件,那么它将调试而不是 运行 exe。如果我在应用程序 >> 资源 >>​​ 图标和清单下将图标切换回(默认图标),那么 exe 将 运行 在调试器之外正常运行 ???有谁知道为什么改变像程序默认图标这样无害的东西会使 EXE 不是 运行?在我意识到导致它不 运行.

的部分后,我将 Google / 进一步调查

@Matt 这看起来像是在您的机器上应用了一些安全策略来阻止任何未知的可执行文件(当您单独单击时)。这在 Debug 中工作正常,因为主机进程将被标记为对该策略安全。在未应用自定义提升权限策略的其他计算机上尝试 运行 .exe,或者联系您的 IT 管理员。

这个问题的答案完全出乎意料。问题出在应用程序的图标

进一步排除故障后,我注意到当我创建一个新项目、将所有文件添加到该项目并编译它时 - 该程序将从 EXE 文件 运行。我继续对项目进行更改,然后在进行一些最后的修改(包括更改应用程序图标、添加强名称以及我在许多其他应用程序上所做的其他事情)之后,我注意到 EXE 突然停止了双击它时工作。

我最终将范围缩小到 当我有一个默认应用程序图标(项目属性 >> 应用程序 >> 图标)时,应用程序可以正常工作从 EXE 启动它时很好。但是,当我将图标更改为我正在使用的图标时,EXE 停止运行。

我以前用过应用程序图标,所以我创建了一个测试项目,什么也没做,但是我把应用程序图标改成了这个。果然,当我这样做时,测试程序的EXE停止工作了。

接下来,我尝试使用与我使用的图标不同 的图标,并且那个图标的 EXE 有效。所以,现在我已经将问题缩小到我正在使用的特定图标的问题。我注意到有效的那个里面有一个 16x16 4 位和 32x32 4 位图像。然后我打开了非工作的。非工作图标分别有 48、32、24 和 16 像素图标(4 位、8 位和 32 位托盘)。

尝试从图标中删除各种图像的几种组合后,我发现 8 位彩色调色板图标图像导致了问题! 删除所有 8-来自图标的位图,程序现在运行正常!

所以,这个故事的寓意是:虽然带有 8 位图像的图标可以很好地用于表单和其他用途,但它们不能很好地作为应用程序图标与 .NET 应用程序一起使用