2010-11-29 19 views
0

セキュリティ関連のタスクを実行するために使用するネイティブライブラリがあります。 Interopライブラリを作成して、.NETから使用できるようにしました。我々は2つのテストアプリケーションを持っている.netからネイティブコードを呼び出すと、それがネイティブプログラムから呼び出されたのと異なる結果になるのはなぜですか?

、最初のアプリケーションは、C++(アンマネージド)で書かれており、第二は、C#で書かれています。それらは、ネイティブライブラリへの呼び出しと全く同じシーケンスを生成しますが、異なる結果を生成します。

私は失われたんだと.NETのインポート定義のいずれかの明白な間違いを見つけることができません。私は非常に単純なインターフェイスでしか動作しないように、私はすでにそれを愚かにしました。 .NET環境からネイティブライブラリを呼び出すと結果に影響するかもしれないというアイディアを探しています。

編集: 私はライブラリの深い知識は持っていないので、ネイティブコードで何が行われているかについてはあまり説明することができません。私はそれが(ヒートビート)スレッドを維持していることを知っています。アプリケーションがVM上で実行されているかどうかを識別するために使用されるライブラリの別の部分も、同じ動作を示します。これは必ずしも関連していません。

私は、C#からネイティブライブラリを消費するのがやや簡単で、C#と同じ結果を与えるので、C++/CLIで別のテストアプリケーションを書いています。

+5

ここではより多くの情報が必要だと思います。あなたは何をしていますか、どのようにしていますか? =) – Jens

+0

ネイティブライブラリが異なる結果のソースである可能性は低いです。チャンスは、テストアプリケーションに違いがあります。 –

+0

これにはさまざまな原因があります。詳細をお知らせください。 –

答えて

2

ワイルド推測:あなたはboolを取る関数にboolを取る機能をマーシャリング。 boolをマーシャリングしないでください。bool

1

ネイティブスレッドとネイティブスレッドのローカルストレージを使用する可能性があります。マネージドスレッドとネイティブスレッドの間には、必ずしも1対1のマッピングがありません。

この可能性を排除するには、BeginThreadAffinity/EndThreadAffinity(つまり、個々の呼び出しの周りのペアではなく、ライブラリへのすべての呼び出しでこれらの呼び出しが1組ずつ呼び出される)

+0

これを調べます。私には良い出発点のように聞こえる。 – Christo

0

キーワード)ライブラリに:私たちは、.NETから(ネイティブライブラリ)を使用することができるように

我々は相互運用ライブラリを書いています。

これはあなたのエラーの原因ではないネイティブライブラリです。特定のネイティブ・コール(特定のパラメーターを持つ特定の関数呼び出し)は、どのように呼び出しても同じ結果を戻します。この問題は、ラッパーが同じ呼び出しを行っていると思うところで微妙なバグが発生する可能性がありますが、interopのバージョンが若干異なる呼び出し(異なる結果)を行っていることになります。

私は最低のレベルであなたの相互運用ライブラリのいくつかの非常に細かいユニットテストで始まります。ネイティブ関数foo(int x、int y)。それをネイティブに呼び、ライブラリ経由で呼び出します。結果は同じでなければなりません。関数呼び出しが見つからなくなるまで続けます。 問題がある場合は、ネイティブライブラリではなく、& interopのマーシャリングで違いがあります。異なる結果を返す個別の呼び出しを見つけた場合、interopでエラーの原因を見つけることができない場合は、個別の呼び出しをSOの質問として投稿してください。

+0

"特定のネイティブ呼び出し(特定のパラメータを持つ特定の関数呼び出し)は、呼び出しの方法に関係なく同じ結果を返します" - 必ずしもそうではありません。ネイティブコードは、関数シグネチャで表現されていない環境についての前提を作成している可能性があります。 – Joe

0

他の人が示唆したように、それはマーシャリング/相互運用性に問題がある可能性があります。

しかし、ネイティブライブラリでは、呼び出しシグネチャでのみ表現されていない環境についての前提が作成されている可能性もあります。

このような前提がいくつかあります。ランダムな例として、AFX_MANAGE_STATEマクロを呼び出さないMFCライブラリ内のメソッドが、.NETコードから呼び出されたときに無効な仮定を作成している可能性があります。

関連する問題