none
VB2003で出来たことが2005では出来なくなった RRS feed

  • 質問

  • YORIGONです。

    VS.NET2005 Academicをインストールし
    Microsoft DirectX SDK (February 2006)も最後にインストールしました

    そこでVB.NET2003でDirectXプログラミングしていたものなのですが
    2005に移植したところコンパイルエラーが発生してしまい。
    非常に困っているところです。

    エラー内容の意味がよくわからないので質問しました。
    エラー内容は以下のとおりです。

    LoaderLock が検出されました。
    Message: DLL 'C:\WINDOWS\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.dll' は、OS ローダー ロック内でマネージ実行を試行しています。DllMain またはイメージ初期化関数内でマネージ コードを実行しないでください。この動作は、アプリケーションをハングさせる原因になる可能性があります。

    実際のソースコード
    ~~~~
    Imports Microsoft.DirectX.AudioVideoPlayback

    中略

        Dim bgm As Audio

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Dim ofd As New OpenFileDialog
      If ofd.ShowDialog = Windows.Forms.DialogResult.Cancel Then Return
            bgm = New Audio(ofd.FileName)
            bgm.Play()
            ofd.Dispose()

        End Sub

        Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
            bgm.Dispose()
        End Sub

    以上のソースコードでエラーが発生するポイントは
    bgm = New Audio(ofd.FileName)
    のところです。
    VB.NET2003では問題なく動作してくれたのですが2005になってから
    予期しないエラーが発生してしまいました。
    これは2005の仕様でしょうか?

    どうか以上の対処法をご教授お願いします。

    2006年5月19日 13:14

回答

  •  YORIGON さんからの引用

    警告を無視して(無視しまくりはどうかと思いますが)そのまま実行を続けたらちゃんと動作してくれました

     YORIGON さんからの引用

    いや~.NET2.0になってからは結構コンピュータを考えた警告を出してくれて
    以前より良くなったのではないかと思います^^

    お時間がありましたら、Visual Studio 2005のメニューの「デバッグ」→「例外」も目を通してみることをおすすめします。
    この中に MDA に検査項目のリストがあって、そこでチェックされた問題について検出されると、今回の LoaderLock のように実行時例外が発生するようになっています。
    LoaderLock はデフォルトでチェックされているかと思いますので、そのチェックを外せば例外は発生しなくなります。

    ちなみに、そのリストを見てみれば分かりますが、デフォルトでは例外が発生しない MDA の検査項目というのも結構あったりするわけですな。

    2006年5月20日 21:38

すべての返信

  •  YORIGON さんからの引用

    そこでVB.NET2003でDirectXプログラミングしていたものなのですが
    2005に移植したところコンパイルエラーが発生してしまい。
    非常に困っているところです。

    コンパイルエラーではなくて、デバッグ実行時に実行時エラーが発生するというものですよね?

    以下の VSUG のスレッドでも書きましたが、基本的には Managed DirectX の設計が、予期しない不具合の原因になりかねないものであるとして、.NET Framework 2.0 のデバッグサービスの強化によって検出されるようになった、というものです。

    .NET  2.0 では、マネージ デバッグ アシスタント (MDA) と呼ばれる実行時エラーチェックの仕組みが追加されました。今回は、この中の LoaderLock  の検出機構が働いていることになります。

    これを仕様かと聞かれると微妙なところですが、Visual Basic 2005 がデバッグ実行時に MDA を有効化するというのはまあ仕様と言えば仕様かもしれません。
    最近話題になった次のスレッドも、今回の LoaderLock とは直接の関係はありませんが、同じ MDA 絡みの問題です。

     YORIGON さんからの引用

    VB.NET2003では問題なく動作してくれたのですが2005になってから
    予期しないエラーが発生してしまいました。

    Visual Basic .NET 2003 (.NET 1.1) の時代には見過ごされていた仕様上の問題が検出できるようになったということで、ある意味では前進なわけですが、場合によっては混乱の種になるところがややこしいところですな。

    以下の件なども、製品のアップデートに伴って実行時チェックを厳しくした結果、デバッグ実行では途中で停止するようになったものです。
    ご参考までに。

    2006年5月20日 6:08
  • YORIGONです。

    NyaRuRuさんどうもありがとうございました。
    警告を無視して(無視しまくりはどうかと思いますが)そのまま実行を続けたらちゃんと動作してくれました
    あとその他の参考資料のご提供もありがとうございます。
    非常に勉強になりました。

    いや~.NET2.0になってからは結構コンピュータを考えた警告を出してくれて
    以前より良くなったのではないかと思います^^

    2006年5月20日 9:28
  •  YORIGON さんからの引用

    警告を無視して(無視しまくりはどうかと思いますが)そのまま実行を続けたらちゃんと動作してくれました

     YORIGON さんからの引用

    いや~.NET2.0になってからは結構コンピュータを考えた警告を出してくれて
    以前より良くなったのではないかと思います^^

    お時間がありましたら、Visual Studio 2005のメニューの「デバッグ」→「例外」も目を通してみることをおすすめします。
    この中に MDA に検査項目のリストがあって、そこでチェックされた問題について検出されると、今回の LoaderLock のように実行時例外が発生するようになっています。
    LoaderLock はデフォルトでチェックされているかと思いますので、そのチェックを外せば例外は発生しなくなります。

    ちなみに、そのリストを見てみれば分かりますが、デフォルトでは例外が発生しない MDA の検査項目というのも結構あったりするわけですな。

    2006年5月20日 21:38
  • YORIGONです。
    返信遅れてしまいすいませんでした。

    どうも!!NyaRuRuさん、おかげさまでわざわざエラーウィンドウ(みたいなやつ)を消さないでそのまま続行できるようになりました!!
    本当に助かりました!!!

    2006年5月23日 12:47