3

何が問題を引き起こしたのかはわかりましたが、理由はまだわかりません。これはfmod、を使い始めたときに発生したものであり、リンカーが静的ライブラリと.dllの実行を決定する方法と関係があるはずです。テスト中の私のコードは静的ライブラリです。これはfmodex_vc、別の静的ライブラリを参照します。これは、ある時点で(いつかはわかりませんが)、そのにロードすることを決定しますfmodex.dll。(これは他のすべてと同じディレクトリにあるので、なぜそれが見つからないのかわかりません。)私の知る限り、テスト対象のコードはfmod初期化関数を絶対に呼び出しませんが、fmodにはいくつかあります。自分自身を初期化し、dllにロードする静的グローバル初期化子?そして、そのコードは、それを使用するモジュール内のコードが...使用された場合にのみ引き込まれますか?

VisualStudioテストフレームワークを使用してアンマネージC++コードをテストしていますが、fmodを使用し始めると、機能しなくなりました。何もしない「テスト」テストでさえ、すべてのテストが報告されます(読みやすくするためにラップされています)。

Unable to get type SlidersTest.UnitTest1, SlidersTest.
    Error: System.IO.FileNotFoundException: 
    The specified module could not be found.
    (Exception from HRESULT: 0x8007007E)

ファイルを除外して再度追加するなど、試行錯誤を繰り返し.cppた結果、問題が発生するのは1つのテストファイルだけであることがわかりました。そして、この行が呼び出された場合にのみ実行されます。

EntityMgr::Init();

興味深いことに、その行がコード内にある場合、すべてのテストはそのメッセージで失敗し始めます。 EntityMgr::Init()はほとんど何もしない関数です:

EntityMgr* EntityMgr::instG = null;

void EntityMgr::Init()
{
   instG = new EntityMgr;
}

class EntityMgr
{
private:
   static EntityMgr* instG;
public:
   EntityMgr()   // does nothing beyond the default 
   {
   }

   static void Init();
   static EntityMgr* Inst() { return instG; }

   ...

   vector<Entity> entitiesG;
};

Entity、FWIWは、ポインタがなくfloat、フィールドにさまざまなsがあるだけの、かなりバニラなクラスです。

  • テストをどのように実行しても(テストビューから、選択して実行、すべて実行、コマンドラインから実行、テストメニューから)、エラーが発生します。
  • デバッガーを使用してテストにステップインしようとすると失敗します。デバッガーがステップインする前にテストが失敗します。システム例外でブレークするようにデバッガーを設定しても、何も実行されませんでした。
  • テスト対象のコードは静的な.libです。CLRサポートは/clrです。
  • ああ、これはちょうど:静的エンティティメンバー関数を呼び出す場合、同じ取引です。上記の静的関数をクラスの外に移動した場合も、同じようになります。しかし、その関数を別のモジュールに移動すれば問題ありません。

例外でデバッガーを中断するように設定すると、何か面白いものが得られます。

First-chance exception at 0x7c812aeb in vstesthost.exe: Microsoft C++ exception: HRException at memory location 0x05129890..

もちろん、その場所にはソースコードはありません。コールスタックは次のとおりです。

     kernel32.dll!7c812aeb()    
    [Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]  
    kernel32.dll!7c812aeb()     
    [External Code] 
    msvcr80.dll!78158ed7()  
    msvcr80.dll!78158e34()  
    msvcr80.dll!78158047()  
    msvcr80.dll!7815850e()  
    msvcr80.dll!78158872()  
    msvcr80.dll!78158a57()  
    msvcr80.dll!78158b11()  
    ntdll.dll!7c9032a8()    
    ntdll.dll!7c90327a()    
    ntdll.dll!7c92a9ef()    
    ntdll.dll!7c90e46a()    
    kernel32.dll!7c812aeb()     
    kernel32.dll!7c812aeb()     
    kernel32.dll!7c812aeb()     
    msvcr80.dll!78139c4d()  
    msvcr80.dll!781323ff()  
    msctf.dll!74755764()    
    msctf.dll!74721557()    
    ws2_32.dll!71ab12bb()   
    ntdll.dll!7c90118a()    
    ntdll.dll!7c91b084()    
    ntdll.dll!7c90de7c()    
    ntdll.dll!7c90d04c()    
    ntdll.dll!7c90e43f()    
    kernel32.dll!7c80b713()     

そして、これがmstestが報告するスタックトレースです-私はそれから何も有用なものを手に入れません。

Unable to get type SlidersTest.game_EntityMgr_test, SlidersTest. Error: System.IO.FileNotFoundException: The specified module could not be found. (Exception from HRESULT: 0x8007007E)
   at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
   at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
   at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, StackCrawlMark& stackMark)
   at System.Reflection.Assembly.LoadFrom(String assemblyFile)
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.GetType(UnitTestElement unitTest, String type)
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.ResolveMethods().

なぜfmodがこれを行うのですか?

4

7 に答える 7

1

Dependency Walker のプロファイル モード ( http://www.dependencywalker.com/ ) でアプリケーションを実行することをお勧めします。DLL と EXE を読み込もうとするすべての試行を結果のエラー コードとともに記録できます。ファイルが見つからないというエラーは、おそらく FMod のリンクから引き出された間接的な依存関係から来ているようです。

この場合、Dependency Walker を使用してアプリケーションをプロファイリングすると、ライブラリの読み込みに 1 回以上失敗したことが示されます。そのうちの 1 人がエラーの責任者になります。

于 2009-05-14T03:06:54.753 に答える
0

これが突然起こり始めたとあなたが言うので、私はこのコード行でのテストが以前はうまく機能していたと思います。これは根本的な選択かもしれませんが、別の解決策がない場合は、おそらくVisual Studioの再インストールを検討するでしょう(確かに長い手順です)

于 2009-04-10T12:31:48.483 に答える
0

あなたがこれまでに投稿したことから、CLR 型ローダー内のどこかで例外がスローされているというのが私の推測ですが、間接的に依存しているアセンブリが GAC にないか、そうではないように見えます。テストディレクトリにコピーされています。

テスト結果に実際のスタック トレースはありますか? これは、ロードしようとしているタイプを絞り込むのに役立つ場合があります。

于 2009-04-09T20:06:11.457 に答える
0

デバッグ中に発生した場所に関係なく、すべての例外で中断するように Visual Studio を設定できますか?

宇宙線または障害のあるハード ドライブが原因でテスト .dll が破損したか、ビルドしている dll が (一貫して) 破損しているように聞こえます。Visual Studio をすべて再インストールする前に、現在のインストールとインストール メディアの内容との間に矛盾がないかどうかを確認する修復を依頼することをお勧めします。

于 2009-04-10T15:25:20.827 に答える
0

FMod .dll はどのようにしてテスト ディレクトリに取り込まれますか? mstest がテストを実行する場所にコピーするように設定していますか? 「出力ディレクトリにコピー」は実際にはこれを達成しないことに注意してください。他にも方法はありますが、よく覚えていません。

于 2009-04-14T14:00:56.660 に答える
0

そのファイルのプロパティが変更された可能性がありますか?おそらく既にこれを見ていると思いますが、すべての設定がVisual Studioの「親から継承」からのものであることを確認してください。

ジェイ

于 2009-04-09T19:51:50.370 に答える
0

デバッガーで実行し、実行出力を確認します。特に、「loading path\fmodex.dll」行で、正しい dll が読み込まれているかどうかを確認します。

異なる構成の dll を混在させると、同様のエラーが発生しました。

于 2009-05-20T15:38:58.207 に答える