0

残念ながら、検索セクションやその他のコーディング フォーラムで探していた awnser を見つけることができなかったので、質問をここに残しておきます。

Windows のスタートアップ プロジェクトの 1 つである非常に単純な C# Application を開発しました。これは、ラベルと単純なマウス イベントを含む単純なパネルを使用して、ポインターの位置を開始位置に戻すトリガーを使用します。

アプリケーションの公開に成功し、私のコンピューターと他のいくつかのコンピューターではスムーズに動作しますが、奇妙な理由により、友人のラップトップではロードされません。

私たちは同じ OS (Windows 7) を共有しており、両方とも x64 バージョンを使用しており、フレームワークは同じように見えますが、タスク マネージャーにプロセスが表示されていても、インストールが完了した後でもロードされません。成功。

そのため、プログラムは実行されますが、ロードされず、分析対象の例外やエラーがスローされないようです。

したがって、私の質問は、私のプログラムが他のコンピューターと完全に互換性を持つための要件は何ですか?

この問題に多くの時間を費やしましたが、正しい awnser を見つけることができないようです。

さらに分析するために、フォーム コードも表示します。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace Labirinto
    {
        public partial class frmLabirinto : Form
        {
            // Toca um som sempre que o utilizador bater numa parede
            System.Media.SoundPlayer startSoundPlayer = new System.Media.SoundPlayer(@"C:\Users\Ricardo Borges\Documents\Visual Studio 2010\Projects\Labirinto\Labirinto\Resources\doh.wav");
            // Toca um som sempre que o utilizador chegar ao final do labirinto
            System.Media.SoundPlayer finishSoundPlayer = new System.Media.SoundPlayer(@"C:\Users\Ricardo Borges\Documents\Visual Studio 2010\Projects\Labirinto\Labirinto\Resources\tada.wav");


    public frmLabirinto()
    {
        InitializeComponent();
        MoveToStart();
    }

    private void frmLabirinto_Load(object sender, EventArgs e)
    {

    }

    /// <summary>
    /// O método permite que o ponteiro do rato volte ao ponto inicial
    /// </summary>
    private void MoveToStart()
    {
        startSoundPlayer.Play(); //Toca o som de reinicio do jogo
        Point startingPoint = panel1.Location; //ponto inicial
        startingPoint.Offset(10, 10); //localizacao do ponto inicial
        Cursor.Position = PointToScreen(startingPoint); //coloca o cursor no local inicial
    }

    private void finishLabel_MouseEnter(object sender, EventArgs e)
    {
        finishSoundPlayer.Play(); //Toca o som de fim de jogo
        // Congratula o utilizador através de uma mensagem no ecrã
        MessageBox.Show("Parabéns, encontrou a saída do labirinto");
        Close();
    }

    private void wall_MouseEnter(object sender, EventArgs e)
    {
        MoveToStart(); //recoloca o ponteiro no ponto inicial ao embater numa parede
    }


}

}

4

2 に答える 2

1

両方の SoundPlayer オブジェクトを初期化するときに使用されるハードコードされた値がエラーを引き起こしているように感じます。たとえば、アプリケーションを実行しているマシンに "Ricardo Borges" という名前のユーザーがいない場合はどうなるでしょうか。

System.Media.SoundPlayer startSoundPlayer = new System.Media.SoundPlayer(@"C:\Users\Ricardo Borges\Documents\Visual Studio 2010\Projects\Labirinto\Labirinto\Resources\doh.wav"); 
System.Media.SoundPlayer finishSoundPlayer = new System.Media.SoundPlayer(@"C:\Users\Ricardo Borges\Documents\Visual Studio 2010\Projects\Labirinto\Labirinto\Resources\tada.wav");

「パスまたは URL が有効でない場合、SoundPlayer は引き続き構築されますが、その後の load メソッドまたは play メソッドの呼び出しは失敗します」という SoundPlayer オブジェクトのMSDN ドキュメントに基づいています。

MoveToStart 関数内の最初の行には、次の行があります。

startSoundPlayer.Play(); 

MSDN のSoundPlayer.Playメソッドを再度参照すると、エラーの原因に応じて、3 つの異なる例外のいずれかがスローされる可能性があります。FileNotFoundExceptionが原因である可能性が高いようです。

問題のあるマシンに、指定された場所と実際のファイルの両方が存在することを確認できますか?

于 2012-04-14T00:37:49.090 に答える
0

Fusion Log ビューアーを使用して、アセンブリの読み込みエラーを診断してみましたか?

Fusion Log Viewer を使用してあいまいなローダー エラーをデバッグする

それが問題でない場合は、アプリケーションにロギング コードを追加し、エラーを「飲み込んでいる」try/catch ブロックがないかコードをチェックします。

于 2012-04-13T23:36:10.610 に答える