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()

私は、ストローをつかんで、さまざまなことを検索して試して、バタバタしています。ここに1つあります:

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 ファイル) をコピーすると、正常に実行されたようです (1 回実行されました)。しかし、今では再び開きたくない状態に戻っており、イベント ログ データは次のとおりです。

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 にアクセスしている場合、この問題は発生しますか?

最終回の更新、私は計算します

要するに、最初に、.exe に必要ないくつかの .dll とテキスト ファイルをコピーできませんでした。それらがそこにあると、それはうまくいきました。それでも、ファイルを右クリックすると、.NETランタイムのバージョンが見つからない/間違っているという偽のエラーメッセージが表示され、エラーメッセージが非常に誤解を招くものであることは、私には非常に奇妙に思えます。エラー メッセージで、見つからなかった .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 に答える