DllImportを使用してP/Invoke経由でC#からC++DLLを呼び出しています。DLLはサードパーティによって生成され、x86のみです(したがって、C#コードもx86としてビルドされます)。
コンソールアプリケーションからDLLの特定の関数を呼び出すと、常に正しい結果が1つ得られます。この関数はファイルパスを取得し、ファイルからいくつかの情報を抽出します。
関数のシグネチャは次のとおりです。
private static extern int Function(
string str1,
int bool1,
ref uint outUint1,
ref uint outUint2,
ref uint outUint3,
ref double outDouble1,
ref double outDouble2,
StringBuilder outStr1);
そして、予期しない結果がref uint
パラメータの1つにあります。
単体テストを作成し、まったく同じコード(すべてのパラメーターとそのようなハードコードを含む)を呼び出すと、まったく異なる結果が得られますが、これは正しくありません。間違った結果は常に同じです。さまざまな異なるランナーを使用してMSTestテストとNUnitテストの両方を試しましたが、同じ結果になりました。
正しい結果が得られるケース:
- コンソールアプリ
- Winformsアプリ
- コードを実行しているが、単体テスト(NUnit)から起動されたコンソールアプリ
誤った結果を生成するケース:
- Resharper Test Runner(NUnit)からのテスト実行
- Visual Studio Test Runner(MSTest)からのテスト実行
- NUnitGUIテストランナーからのテスト実行
- NUnitコンソールテストランナーからのテスト実行
私のテスト環境はWindows8で、C#は.NETFramework4をターゲットとするx86用に構築されています。
この問題の原因や、さらにデバッグするために私ができることについて何か考えがありますか?
私は間違いなくDLLを作成したサードパーティに連絡しようとしますが、この問題の原因を正確に把握しておくと、問題が解決する可能性が大幅に高まります。