.Net Framework初始化错误 - 无法找到运行此应用程序的运行时版本(TypeInitializationException)

时间:2012-06-19 19:22:54

标签: c# .net winforms deployment .net-4.0

当我尝试部署它时,我正在使用我的应用程序遇到错误,但仅限于某些情况:

  1. 在VS IDE中:没问题,我的应用运行正常
  2. 在Windows资源管理器中双击我的.exe:没问题,我的应用运行正常
  3. 在Windows资源管理器中右键单击我的.exe并选择“运行方式”:我收到上述错误,但无法运行
  4. 在已部署.exe的远程计算机上右键单击Windows资源管理器中的.exe并选择“运行方式”:我收到上述错误,但无法运行
  5. 双击已部署.exe的远程计算机上的.exe桌面链接/快捷方式:非常模糊的错误消息,我的应用程序将无法运行。
  6. 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“但它没有区别;我是否需要在”configSections“部分添加”startup“?

    <?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运行时缺失/错误版本的错误信息以及错误信息是如此误导,这似乎很奇怪。为什么错误的msg不能告诉你哪个.DLL或找不到的文件?这将使调试变得更加简单/快速。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

根据您在上面发布的错误描述,我认为这根本与.NET框架无关;相反,这看起来是你的表单的构造函数抛出错误。这可以通过堆栈跟踪从duckbilledPlatypus.duckbilledPlatypusMainForm..ctor()开始来支持。

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