none
ゲームが配布先で動作しない

    質問

  • 初めまして、白石晶と申します。J2EEとPHPによるWebアプリケーション開発の経験、C#による自分で使うミニツールの開発の経験があります。いきなりの質問になります。申し訳ありません。

    Microsoft Visual C# 2005 Express Edition
    Microsoft XNA Game Studio 2.0

    の組み合わせにて、Windows Vista Business上でゲームの開発を趣味にて行っています。友人二名にある程度完成したゲームの動作確認をお願いしたところ、二名とも動作しませんでした。例外の内容をイベントログに書き込むようにして、ログを回収したところ、以下のような内容のようです。
    イベントの種類:	エラー
    イベント ソース: .NET Runtime 2.0 Error Reporting
    イベント カテゴリ: なし
    イベント ID: 5000
    日付: 2008/02/25
    時刻: 12:59:07
    ユーザー: N/A
    コンピュータ:
    説明:
    EventType clr20r3, P1 thehouseinlakeside.exe, P2 1.0.2975.30036, P3 47bfce18, P4 thehouseinlakeside, P5 1.0.2975.30036, P6 47bfce18, P7 97, P8 0, P9 system.typeinitialization, P10 NIL.

    詳細な情報は、http://go.microsoft.com/fwlink/events.asp の [ヘルプとサポート センター] を参照してください。
    データ:
    0000: 63 00 6c 00 72 00 32 00 c.l.r.2.
    0008: 30 00 72 00 33 00 2c 00 0.r.3.,.
    0010: 20 00 74 00 68 00 65 00 .t.h.e.
    0018: 68 00 6f 00 75 00 73 00 h.o.u.s.
    0020: 65 00 69 00 6e 00 6c 00 e.i.n.l.
    0028: 61 00 6b 00 65 00 73 00 a.k.e.s.
    0030: 69 00 64 00 65 00 2e 00 i.d.e...
    0038: 65 00 78 00 65 00 2c 00 e.x.e.,.
    0040: 20 00 31 00 2e 00 30 00 .1...0.
    0048: 2e 00 32 00 39 00 37 00 ..2.9.7.
    0050: 35 00 2e 00 33 00 30 00 5...3.0.
    0058: 30 00 33 00 36 00 2c 00 0.3.6.,.
    0060: 20 00 34 00 37 00 62 00 .4.7.b.
    0068: 66 00 63 00 65 00 31 00 f.c.e.1.
    0070: 38 00 2c 00 20 00 74 00 8.,. .t.
    0078: 68 00 65 00 68 00 6f 00 h.e.h.o.
    0080: 75 00 73 00 65 00 69 00 u.s.e.i.
    0088: 6e 00 6c 00 61 00 6b 00 n.l.a.k.
    0090: 65 00 73 00 69 00 64 00 e.s.i.d.
    0098: 65 00 2c 00 20 00 31 00 e.,. .1.
    00a0: 2e 00 30 00 2e 00 32 00 ..0...2.
    00a8: 39 00 37 00 35 00 2e 00 9.7.5...
    00b0: 33 00 30 00 30 00 33 00 3.0.0.3.
    00b8: 36 00 2c 00 20 00 34 00 6.,. .4.
    00c0: 37 00 62 00 66 00 63 00 7.b.f.c.
    00c8: 65 00 31 00 38 00 2c 00 e.1.8.,.
    00d0: 20 00 39 00 37 00 2c 00 .9.7.,.
    00d8: 20 00 30 00 2c 00 20 00 .0.,. .
    00e0: 73 00 79 00 73 00 74 00 s.y.s.t.
    00e8: 65 00 6d 00 2e 00 74 00 e.m...t.
    00f0: 79 00 70 00 65 00 69 00 y.p.e.i.
    00f8: 6e 00 69 00 74 00 69 00 n.i.t.i.
    0100: 61 00 6c 00 69 00 7a 00 a.l.i.z.
    0108: 61 00 74 00 69 00 6f 00 a.t.i.o.
    0110: 6e 00 20 00 4e 00 49 00 n. .N.I.
    0118: 4c 00 0d 00 0a 00 L.....
    友人のマシンについて詳細は不明ですが、Windows XP SP2マシンで
    のインストールとWindowsUpdateによる各種修正の適用は完了しているらしいです。私手持ちのXP SP2マシンでも同様の現象を確認しましたが、XNAの開発環境を構築した段階で動作する状態になってしまいました。

    インターネット上の情報でそれらしいものも多くあり、ここの過去のスレッドも確認しました。多くの場合で解決策となっている新しいヴァージョンのDirectXのインストールでは問題を解決できませんでした。

    他に注意すべき点や、原因と特定・解決方法などございますでしょうか。
    2008年2月25日 6:04

回答

  • 最終的なまとめを書かせていただきます。

    XNA Game Studio 2.0で作成したゲームは配布先に以下のランタイムを必要とする。インストール順序は不問。

    DirectX End-User Runtime Web Installer - 日本語は常に最新のDirectXランタイムをダウンロードしてインストールできる。XNA 2.0から.NetのランタイムはMicrosoft .NET Framework 2.0 Service Pack 1 (x86)が必須となっている。

    それでもXNAゲームが動作しない場合、Program.csの該当箇所を以下のように修正し、動作しない原因を探る。このコードを挿入すると実行ファイルと同じ場所にerror.logというファイルが作成され、動作しない原因となったExceptionのスタックトレースが記載される。

    Code Snippet

    try

    {

        using (SampleGame game = new SampleGame())

        {

            game.Run();

        }

    }

    catch ( Exception e )

    {

        System.IO.File.WriteAllText( "error.log", e.ToString() );

    }


    この作業で原因がはっきりと特定できない場合、その環境はXNAゲームが動作しない環境となる。

    以上まとめでした。Yuichi Ito様、誠にありがとうございました。

    (.Net SP1が必要という記事を元に加筆訂正しました。)
    2008年2月26日 23:36
  • 友人二名の環境では、.Net 2.0 SP1のランタイムをインストールすることでゲームが動作したそうです。これで、「ゲームが配布先で動作しない」件は、無事に解決しました。お陰様で、友人から実行時エラーと貴重な助言を得ることができました。

    今回のスレッドについてのまとめに加筆訂正を入れておきました。今回動作確認に使ったソースとバイナリもそのまま残しておきます。同じような問題に遭遇した方の助けになれれば幸いです。

    Yuichi Ito様、ありがとうございました。重ねてお礼申し上げます。

    2008年2月27日 5:42

すべての返信

  • TypeInitialization例外が発生しているので、なにか必要なランタイムが足りない可能性があります。

    より詳しい情報を得るために、Program.csファイルのMainメソッド内で例外をキャッチして

    その情報をファイルに書き出すコードを追加してください。

     

    Code Snippet

     

    try

    {

        using (SampleGame game = new SampleGame())

        {

            game.Run();

        }

    }

    catch ( Exception e )

    {

        System.IO.File.WriteAllText( "error.log", e.ToString() );

    }

     

     

    そして、友人の環境で実行すると、error.logというファイルが実行ファイルと同じパスに作られるはずなので

    その内容を再度送ってください。

    2008年2月25日 10:20
  • エラー出力のコードを挿入したものを実行してもらいました。一名から返答があり、ログファイルは以下のような内容となっています。Windowsのユーザ名がそのまま出ていたのでその部分だけ加工させていただきました。

    System.TypeInitializationException: The type initializer for 'TheHouseInLakeSide.GameMain' threw an exception. ---> System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Xna.Framework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d' or one of its dependencies. このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。 (Exception from HRESULT: 0x800736B1)
    File name: 'Microsoft.Xna.Framework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d' ---> System.Runtime.InteropServices.COMException (0x800736B1): このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。 (Exception from HRESULT: 0x800736B1)
       at TheHouseInLakeSide.GameMain..ctor()
       at TheHouseInLakeSide.GameMain..cctor() in C:\Users\****\PersonalData\CSharp\TheHouseInLakeSide\Sources\TheHouseInLakeSide\Sources\ProgramCodes\GameMain.cs:line 25


       --- End of inner exception stack trace ---
       at TheHouseInLakeSide.GameMain.get_Instance()
       at TheHouseInLakeSide.Program.Main(String[] args) in C:\Users\****\PersonalData\CSharp\TheHouseInLakeSide\Sources\TheHouseInLakeSide\Sources\ProgramCodes\Program.cs:line 20

    XNAのランタイムが正常にインストールできていないのでしょうか・・・?

    2008年2月25日 12:15
  • ひとつ注意が必要なのはDirectX End-User Runtimes (November 2007)をダウンロードして実行しただけでは

    DirectXのランタイムはインストールされません。exeを実行すると、単にDXSETUP.exeを含むセットアップに必要なファイルが

    解凍されるだけなので、その後に解凍先からDXSETUP.exeを実行する必要があります。

     

    XNA 2.0はD3DXのdllを必要とするのでc:\windows\system32フォルダにd3dx9_31.dllがあることを確認してください。

    もしなければ前述の通り、解凍はしたけどインストールはしていなかったのが原因です。

     

    Direct Xランタイムのインストールには以下のDirectX End-User Runtime Web Installerをお勧めします。

    http://www.microsoft.com/downloads/details.aspx?familyid=2DA43D38-DB71-4C1B-BC6A-9B6652CD92A3&displaylang=ja

    このセットアップファイルは常に最新のDirectXランタイムをインストールしてくれるので、ユーザーがどのバージョンを

    インストールするのかを気にすることなく使えます。

    2008年2月25日 13:35
  • 何度も、ご指摘ありがとうございます。

    C:\Windows\system32フォルダにd3dx9_31.dllが存在していることと、DXSETUP.EXEの実行をきちんと行ったのかということについては、二名にすでに確認しています。Webインストーラも試してもらいました。追加で新たに一名の友人に動作確認をお願いしたところ全く同じ現象が発生しています。

    私の作成したものに問題があるという可能性もあり得ますか。
    私の手持ちのXPマシンでは開発環境を作った段階で動作してしまったので、作ったばかりの空っぽのソリューションで動作確認などは頼んでいません。

    .Net 2.0のランタイム>XNAのランタイムという順序でインストールした後、動作しなかったため、ManagedDirectXの経験からDirectXの新しいものが必要なのではないかとDirectXのランタイムを最後に入れてもらいました。最後の一名はXNA>.Net>DirectXという順序だったらしいです。導入の順序などは関係あるのでしょうか。

    2008年2月25日 13:59
  • XNAで作られたゲームを遊ぶにはDirectXランタイム、.Net 2.0ランタイム、そしてXNAのランタイムの三つが必要です。

     

    とりあえず、GameMain.csの25行目付近のコードを差し支えなければ教えてもらえないでしょうか?

     

    そして、初期状態のゲームを作って動作確認してみてください。動作するのであれば、白石さんのプロジェクト側の

    問題の可能性があり、動かないのであればXNAの動作できる環境にないということが判ります。

     

     

     

    2008年2月25日 14:50
  • ソースはいずれ公開する予定だったので、初期状態のゲームと25行目付近と同様の修正を施した初期状態のゲーム、今回作成したゲームとの合計三本のソースを公開してみました。
    • http://khnum.no-ip.org/blog/wp-content/uploads/2008/02/windowsgame1_src.ZIP
    • http://khnum.no-ip.org/blog/wp-content/uploads/2008/02/windowsgame2_src.ZIP
    • http://khnum.no-ip.org/blog/wp-content/uploads/2008/02/thehouseinlakeside_src.ZIP
    実行ファイルを作って、実行の確認をしてもらいました。結果はすべて動作せず、でした。どれも私の開発機と手持ちのXPマシンでは動作しています。

    Game1.csの25行目付近は以下のような感じとなっています。

    Code Snippet
       public class Game1 : Microsoft.Xna.Framework.Game
        {

            private static Game1 instance = new Game1();
            GraphicsDeviceManager graphics;
            SpriteBatch spriteBatch;

            private Game1()
            {
                graphics = new GraphicsDeviceManager(this);
                Content.RootDirectory = "Content";
            }

            public static Game1 Instance
            {

                get
                {

                    return instance;

                }

            }


    Program.csの側は以下のようになっています。

    Code Snippet

            static void Main(string[] args)
            {
                using (Game1 game = Game1.Instance)
                {
                    game.Run();
                }
            }


    Gameクラスのオブジェクトをよそのクラスから使う機会が多かったので直接参照できるように作ってみたのですが・・・。しかし、XNAのテンプレートそのままのソースも動作していないので、私の工夫が直接の原因とは言い切れません。

    初期状態のゲームすら
    動作しなかったということは「XNAの動作できる環境にない」という結論になるわけですね・・・。非常に残念です。
    2008年2月26日 7:25
  • 最終的なまとめを書かせていただきます。

    XNA Game Studio 2.0で作成したゲームは配布先に以下のランタイムを必要とする。インストール順序は不問。

    DirectX End-User Runtime Web Installer - 日本語は常に最新のDirectXランタイムをダウンロードしてインストールできる。XNA 2.0から.NetのランタイムはMicrosoft .NET Framework 2.0 Service Pack 1 (x86)が必須となっている。

    それでもXNAゲームが動作しない場合、Program.csの該当箇所を以下のように修正し、動作しない原因を探る。このコードを挿入すると実行ファイルと同じ場所にerror.logというファイルが作成され、動作しない原因となったExceptionのスタックトレースが記載される。

    Code Snippet

    try

    {

        using (SampleGame game = new SampleGame())

        {

            game.Run();

        }

    }

    catch ( Exception e )

    {

        System.IO.File.WriteAllText( "error.log", e.ToString() );

    }


    この作業で原因がはっきりと特定できない場合、その環境はXNAゲームが動作しない環境となる。

    以上まとめでした。Yuichi Ito様、誠にありがとうございました。

    (.Net SP1が必要という記事を元に加筆訂正しました。)
    2008年2月26日 23:36
  • 重ね重ね迷惑をおかけして申し訳ありません。

     

    こちらの方で再確認したところ、XNA 2.0で作ったゲームを他のPCで動作させるには以下の3つが必要になります。

    .Net 2.0では無く、.Net 2.0 (SP1)が必要になります。これは私自身勘違いしていたのですが(GSE 1.0は.Net 2.0で動作してたので)、XNA 2.0では .Net 2.0 (SP1)に含まれているC++ 2005のランタイムに依存しています。開発環境を整えると、C++ 2005のランタイムがインストールされるので、問題なく動作したのでしょう。

     

    私の方でプロジェクトをコンパイルし、その実行ファイルを素のWindows XPから以上の三つのランタイムをインストールした状態で試したところ、Microsoft.Xna.Frameworkを問題なくロードできていることを確認しました。ただし、SpriteFontで設定されているフォントが無かったのでMSゴシックに変えたのと、SQLLiteでdbファイルを開くのに失敗しますが、これはXNAとは無関係な問題と思われます。

     

    と、言う訳で、お手数ですが.Net 2.0(SP1)をインストールして再度試して見ては頂けないでしょうか?

    2008年2月27日 1:26
  • おっと、ソースを確認したら直前まで別の動作確認をしていたときの余計なコードが入ってました。わざわざ確認していただいたのに申し訳ありませんでした。

    余分なコードを取り除いたバイナリとソースを用意しました。

    http://khnum.no-ip.org/blog/wp-content/uploads/2008/02/thehouseinlakeside.ZIP
    http://khnum.no-ip.org/blog/wp-content/uploads/2008/02/thehouseinlakeside_src.ZIP

    これで友人に再度動作確認をお願いしています。
    2008年2月27日 2:58
  • 友人二名の環境では、.Net 2.0 SP1のランタイムをインストールすることでゲームが動作したそうです。これで、「ゲームが配布先で動作しない」件は、無事に解決しました。お陰様で、友人から実行時エラーと貴重な助言を得ることができました。

    今回のスレッドについてのまとめに加筆訂正を入れておきました。今回動作確認に使ったソースとバイナリもそのまま残しておきます。同じような問題に遭遇した方の助けになれれば幸いです。

    Yuichi Ito様、ありがとうございました。重ねてお礼申し上げます。

    2008年2月27日 5:42