何が問題を引き起こしたのかはわかりましたが、理由はまだわかりません。これは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がこれを行うのですか?