私の質問は少し一般的であるので、私は正確な答えを探していないんだけど、多分それに見て、いくつかの方向性が私を助ける...C#DLLIMPORTトラブル
C#。 私たちは、このサードパーティーの会社と協力して、使用する必要があるネイティブC++ DLLを提供しました。 私が必要としたC++メソッドはC#から参照しやすい方法で公開されていなかったので、別のネイティブC++ Dllでdllをラップしました。
私は2つのネイティブC++ dllを持っています.1つはもう一方をラップしています。
私はC++で作成したメソッドを呼び出す小さなC#コンソールアプリケーションを作成しました。 私のメソッドのシグネチャは次のようになります。私のコンソールアプリケーションで
[DllImport("HashMethodWrapper.dll")]
[return: MarshalAs(UnmanagedType.LPStr)]
private static extern string CreateHash(
string input,
[MarshalAs(UnmanagedType.LPStr)]StringBuilder output);
、すべてが正常に動作し、私はいつも、結果に期待した文字列イムを受けます。
私はそれを私が実際に必要とする場所なので、作成したWebサービスまたはWebアプリケーションに移動すると、受信した文字列がガベージであり、一貫していないことがわかります。それは失われたメモリなどの参照を取得しているようですが、これは唯一の推測です...
私のコンソールアプリケーションではすべてが動作するので良い。
は誰も私を助けるかもしれない方向を持っています??? ...事前に
おかげで、 gillyb
編集:私はそれはいくつかの固定されていないオブジェクトとしなければならないかもしれないと思っ 、だから私は固定ステートメントのようなものを呼び出すことを試みた:
...しかしこれはまだ私のためにそれをしなかった。これはオブジェクトを固定する正しい方法ですか?
第二編集:私は
extern "C" __declspec(dllexport) bool CreateRsaHash(char *inputPass, char *hashPass);
とするメソッドのシグネチャを変更し :
extern "C" __declspec(dllexport) char *CreateRsaHash(char *inputPass, char *hashPass);
第三編集: C++でのメソッドのシグネチャは次のようになります探している戻り値は*hashPass
パラメータに格納されます。
ここでは、簡単なコンソールアプリケーションを作成してテストしました。メインクラスにDllImportを挿入し、メソッドを直接呼び出すとすべてがうまく動作しますが、DllImportを移動して別のクラスにメソッドをラップし、そのクラスをConsoleの「Main」メソッドから呼び出すと、StackOverflow例外が発生します。
誰もがこれが起こっている理由を知りましたか?
C/C++での関数ヘッダーの宣言方法を教えてください。それは助けることができる:) –
APIの著者を殺す、非常に明確なメモリリークが起こっている... – leppie
なぜ???あなたは理由を説明してください、なぜそれが署名からとても明らかであるのですか?うまくいけば、私たちはまだそれを修正することができます! – gillyb