2009-04-09 1 views
3

を追加した後、一つの試験では、コードの特定の行あれば種類を取得することができません、失敗、とにFileNotFoundException fmodを使用し始め、リンカーがスタティックライブラリを持ち込んで実行する方法と何か関係があり、.dllのものが必要です。テスト中の私のコードは静的なlibです。それはfmodex_vcを参照しています。別の静的なlibです.にロードすることを決めています。 (これは他のものと同じディレクトリにあるので、なぜそれが見つからないのか分かりません)。私が知る限り、テスト対象のコードはfmod初期化関数を絶対に呼び出さないが、fmodには自分自身を初期化してdllでロードする静的なグローバル初期化子?そのコードは、それを使用するモジュールのコードが使用される場合にのみ取得されます。すべてのテストは、私は、問題の原因を考え出したが、なぜ私はまだ知らないFMODのVisual C++テスト

私はVisual Studioのテストフレームワークを使用して管理されていない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* 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のためだけの様々な、ないポインタとはかなりバニラクラスです:EntityMgr::Init()は非常に少ないん機能ですそのフィールド。

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

私はすべての例外でブレークし、デバッガを設定した場合、私が面白い何かを得るか:

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がこれを行うのですか?

+0

問題を再現できるようなコードがあるとは思いませんか? 同じコードを含む通常のコンソールアプリケーション(MSTestではなく)を作成するとどうなりますか? – jalf

+1

このコンテキストで役立つかもしれませんが、MS DLLでいっぱいにスタックトレースが表示されるたびに、MSシンボルサーバーを使用するようVisual Studioを構成する利点を指摘できません。 基本設定の最初のGoogleの結果の1つだけ: http://geekswithblogs.net/mskoolaid/archive/2005/12/17/63418.aspx 少なくとも、多くの関数名が表示されますそのスタックトレースでは、問題の診断に役立つかもしれません。 – imaginaryboy

答えて

0

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

ジェイ

+0

機能が動作するファイルと機能しないファイルの2つのファイルは、同じプロパティを持つように見えます.VSの2つのインスタンスでプロパティを開くことによって、ダブルチェックされます。 –

0

私の最高の推測で、よりあなたはそれまで掲載例外はCLR型ローダー内のどこかにスローされていることであるてきたもの - それはあなたが間接的にISNに依存しているアセンブリのように見えますGACに存在しないか、テストディレクトリにコピーされていません。

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

+0

追加されました - 何か助けてください? –

0

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

+0

またはソース管理に戻ってください。悲しいことに、私たちはホストとの間で問題を抱えていましたが、1回のチェックインで約1週間分の変更がありましたので、変更した正確な変更はわかりません。 –

0

Visual Studioを設定して、デバッグ中

宇宙線や欠陥のあるハードドライブが原因でテスト.dllが壊れているか、ビルドしているdllが壊れている(一貫して)ように見えます。すべてのVisual Studioを再インストールする前に、修復を依頼して、現在のインストールとインストールメディアの内容の不一致をチェックする必要があります。

0

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

1

アプリケーションをDependency Walkerのプロファイルモード(http://www.dependencywalker.com/)で実行することをお勧めします。 DLLとEXEをロードしようとするすべての試行を結果のエラーコードとともに記録することができます。つまり、File not Foundエラーが間接依存から来ている可能性があります。おそらく、FModのリンクから取り込まれている可能性があります。

この場合、Dependency Walkerを使用してアプリケーションをプロファイリングすると、1つまたは複数のライブラリをロードできませんでした。そのうちの1人がエラーの原因となる者になります。

0

私はそれをデバッガで実行して、実行出力をチェックします。特に、 "dllパス" \ fmodex.dll行をロードして、適切なdllがロードされているかどうかを確認してください。

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

関連する問題