2

PInvoke Interop Assistantを使用して、C#PInvoke署名を生成しました。これについて確認をお願いします。DLLを呼び出すと、「PInvokeDLLが見つかりません」というメッセージが表示されます。関数をエクスポートしています。DLLは実行可能ファイルとともに存在します。メッセージとcipherTextはrawバイトのイン/アウトブロブであり、同じバッファです。

extern "C" int __declspec(dllexport) EncryptDeviceName(uint8 *message, uint8 *ciphertext, uint64 msglength)
{
    ...

    return 0;
}

次のC#PInvoke署名が生成されました。

   /// Return Type: int
   ///message: UINT8*
   ///ciphertext: UINT8*
   ///msglength: UINT64->unsigned __int64
   [DllImport("HC128.dll", EntryPoint = "EncryptDeviceName")]
   public static extern int EncryptDeviceName(System.IntPtr message, System.IntPtr     ciphertext, ulong msglength);

次の同様の質問の提案に従い、更新を提供します。

アップデート

私の署名は、マーシャルalloc/deallocを使用するWindowsCE6で機能します。Tergiverの署名はWindowsCE6でも機能し、マーシャルの割り当て/割り当て解除は必要ありません。

4

2 に答える 2

2

あなたは行方不明CallingConvention.Cdeclです。または__stdcall、C側で使用します。

于 2012-07-25T03:07:47.397 に答える
0

ap/Invoke宣言を書く方法はたくさんあります。与えられたものは使用できますが、マーシャラーのジョブ(アンマネージメモリの割り当て、コピー、および文字エンコード変換の実行)を実行する必要があります。

そのネイティブ宣言は、必要なマーシャリングを推測するのに十分な情報を提供しません。これが、おそらくそれが存在しない理由です。

ネイティブ関数はどの文字エンコードを期待していmessageますか?生のバイトのブロブですかciphertext、それとも文字エンコード(入力と出力の両方)がありますか?

更新しました

messageとが両方ともcipherText生のバイト配列である場合、それらを次のようにマーシャリングすることができます

[DllImport("HC128.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "EncryptDeviceName")]
 public static extern int EncryptDeviceName([In] byte[] message, [In, Out] byte[] ciphertext, ulong msglength);

In[Attribute]とマーシャラーOut[Attribute]にコピーを実行する方法を指示します。[In, Out]はデフォルトです、私は明示的にするのが好きです。

于 2012-07-24T21:49:51.867 に答える