2009-06-13 11 views
3

2つのC++ DLLがあります。そのうちの一つは、以下の機能が含まれていますC++の関数をC#から呼び出す

BYTE* encrypt(BYTE *inOut, UINT inputSize, BYTE *secretKey, UINT secretKeySize). 

のC#からこれら2つの機能を呼び出す方法があります:他の一つは、この機能が含まれている

void init(const unsigned char* initData, const unsigned char* key) 

?私はC#で[DllImport]を使用してC++関数を呼び出すことができることを知っていますが、ポインタが苦労しています。

助けていただけたら幸いです!

答えて

6

はい、あなたは彼らがにextern「C」のセクションに包まれていると仮定してのC#からこれらの両方を呼び出すことができます。私はあなたに詳細なPInvoke署名を与えることはできません。なぜなら、さまざまなパラメータがどのように関連しているかに関する十分な情報がないからです。私たちはより良い署名

  1. を作成できるようにする情報の

    [DllImport("yourdllName.dll")] 
    public static extern void init(IntPtr initData, IntPtr key); 
    
    [DllImport("yourdllName.dll")] 
    public static extern IntPtr encrpyt(IntPtr inout, unsigned inuputSize, IntPtr key, unsigned secretKeySize); 
    

    小品暗号割り当てられたメモリのリターンですか?

  2. #1がtrueの場合、メモリはどのように割り当てられますか
  3. パラメータの仕組みについての基本的な説明はありますか?
  4. 私は、すべてのポインタ値が単一要素の代わりに要素の配列/グループを表すと推測していますか?
+0

はい、暗号化の戻り値はメモリに割り当てられます。通常、返されるデータのサイズは既知です(8バイト)。 重要なパラメータは、inOutとsecretKeyです。基本的には、0からinputSizeまたはsecretKeySizeで指定されたサイズまでのforを使用して、配列からすべてのデータを読み取ります。 – alex

0

ポインタの場合、使用するのはIntPtrです。

[DllImport("whatever.dll")] 
static extern void init(IntPtr initData, IntPtr key); 
0

クラスの場合、特別な操作は必要ありません。値型については、refキーワードを使用する必要があります。

MSDNには、これをまとめた記事があります。 http://msdn.microsoft.com/en-us/library/awbckfbz.aspx

+1

はほぼ確実にデータとして適切にここでは動作しません代わりに、あなたは正しい – JaredPar

+0

単一値の配列を表し、これらは配列です。たとえば、2番目の関数inOutの最初のパラメータは通常8バイトです。 – alex

+0

実際には、配列をrefパラメータに渡すことができます: "ref a [0]" - 配列を固定し、最初の項目のアドレスをC関数に渡します。 –

2
[DllImport("yourdll.dll")] 
static extern void init([MarshalAs(UnmanagedType.LPArray)] byte[] initData, [MarshalAs(UnmanagedType.LPArray)] byte[] key); 

[DllImport("yourdll.dll")] 
static extern IntPtr encrypt([MarshalAs(UnmanagedType.LPArray)] byte[] inOut, int inputSize, [MarshalAs(UnmanagedType.LPArray)] byte[] key, int secretKeySize); 
関連する問題