1

我在尝试部署应用程序时遇到了上述错误,但仅在某些情况下:

  1. 在 VS IDE 中:没问题,我的应用运行良好
  2. 在 Windows 资源管理器中双击我的 .exe:没问题,我的应用程序运行良好
  3. 在 Windows 资源管理器中右键单击我的 .exe 并选择“运行方式”:我收到上面的错误,它不会运行
  4. 在已部署 .exe 的远程计算机上的 Windows 资源管理器中右键单击我的 .exe,然后选择“运行方式”:我收到上述错误,它不会运行
  5. 在已部署 .exe 的远程计算机上双击 .exe 的桌面链接/快捷方式:非常模糊的错误消息,我的应用程序将无法运行。

Windows 事件日志中的信息(在场景 3 失败后)是:

Type: Error
Source: .NET Runtime
Message: Application: duckbilledPlatypus.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.TypeInitializationException
Stack:   at duckbilledPlatypus.duckbilledPlatypusMainForm..ctor()
   at duckbilledPlatypus.Program.Main()

我四处游荡,寻找和尝试不同的东西,抓住稻草。这是一个:

我的 App.config 文件(如下)的布局有问题吗?

注意:我刚刚添加了“supportedRuntime version="v4.0.30319" 但没有任何区别;我需要将“startup”添加到“configSections”部分吗?

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net"     
type="log4net.Config.Log4NetConfigurationSectionHandler,     
log4net"/>
  </configSections>
  <log4net>
    <appender name="ConsoleAppender"     
type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date{ISO8601} [%thread]     
%-5level %-50.50logger | %message%newline"/>
      </layout>
    </appender>
    <appender name="DebugAppender"     
type="log4net.Appender.DebugAppender">
      <immediateFlush value="true"/>
      <layout type="log4net.Layout.SimpleLayout"/>
    </appender>
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="ConsoleAppender"/>
    </root>
  </log4net>
  <startup>
    <supportedRuntime version="v4.0"    
sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v4.0.30319" />
  </startup>
</configuration>

注意:我安装了以下 .NET 版本:1.0.3705;1.1.4322;2.0.50727;3.0;3.5;和 4.0.30319

我在其计算机上部署了我的应用程序的用户也是如此......

如果我将启动更改为:

  <startup>
    <supportedRuntime version="v4.0.30319" 
sku=".NETFramework,Version=v4.0.30319" />
  </startup>

我得到(即使在 IDE 中),“要运行此应用程序,您首先必须安装以下 .NET Framework 版本之一:.NETFramework,Version=4.0.30319 您想下载并安装 .NETFramework,Version- v4.0.30319 现在?

但是,如果我只是使用它:

  <startup>
    <supportedRuntime version="v4.0.30319" />
  </startup>

它在 IDE 中运行良好......但我仍然有所有有问题的其他场景(主要是它不会在部署位置运行)......???

更新

作为对 Charleh 的回答,主窗体的构造函数中唯一的内容是:

InitializeComponent();

foreach (string arg in Environment.GetCommandLineArgs()) {
    if (arg == "-DEBUG") {
        InDebugMode = true;
        break;
    }
}

tsch = new ToolStripControlHost(dateTimePickerDuckbilledPlatypus);
toolStripDuckbilledPlatypusMain.Items.Add(tsch);

再次更新

我刚刚尝试从 App.config 中完全删除以下内容:

  <startup>
    <supportedRuntime version="v4.0.30319" />
  </startup>

……但这没什么区别。

再次更新

似乎一旦我复制了一个它需要访问的文件(一个 .txt 文件),它就运行良好(它这样做了一次)。但是现在又回到了不想再打开的状态,事件日志数据是:

Source: .NET Runtime
Message: Application: duckbilledPlatypus.exe Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileLoadException
Stack:   at duckbilledPlatypus.duckbilledPlatypusMainForm.InitializeComponent()
   at duckbilledPlatypus.duckbilledPlatypusMainForm..ctor() at duckbilledPlatypus.Program.Main()

如果不止一个人访问 .exe 或 .txt,会不会出现这个问题?

最后一次更新,我认为

结果是,首先我未能复制几个 .dll 和 .exe 所需的文本文件。一旦那些在那里,它运行良好。尽管如此,在我看来,右键单击该文件会给出关于 .NET 运行时版本缺失/错误的虚假 err msg 并且 err msg 具有误导性,这对我来说似乎很奇怪。为什么 err msg 不能告诉您未找到哪个 .DLL 或文件?这将使调试变得更简单/更快。

4

2 回答 2

1

由于它是一个表单应用程序,请添加它并查看是否从错误中获得更多信息;您可能需要使用 EventLog.CreateEventSource() 注册事件日志源

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());

        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);
        Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    }

    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        EventLog eLog = new EventLog("SomeLog", ".", "YourApp");

        eLog.WriteEntry(UnrollException(e.Exception), EventLogEntryType.Error);
    }

    static string UnrollException(Exception ex)
    {
        StringBuilder sb = new StringBuilder();

        sb.Append(ex.Message);

        while (ex.InnerException != null)
        {
            ex = ex.InnerException;
            sb.Append(Environment.NewLine);
            sb.Append(ex.Message);
        }

        return sb.ToString();
    }

编辑:免责声明-我实际上并没有运行此代码,因此它可能会引发一些它自己的异常:D

于 2012-06-19T20:38:24.403 回答
1

根据您上面发布的错误描述,我认为这根本与 .NET 框架无关;相反,这看起来是您的表单的构造函数引发了错误。这得到了堆栈跟踪从 开始的事实的支持duckbilledPlatypus.duckbilledPlatypusMainForm..ctor()

尝试在构造函数中注释掉代码并查看应用程序是否运行。如果它确实运行,您可以更仔细地调查哪些代码导致了未处理的异常。InitializeComponent我的怀疑是,当运行导致此异常时,您可以控制表单。

于 2012-06-19T20:51:41.230 回答