2016-11-03 10 views
0

私はC#アプリケーションの中でネイティブのC++ dllを使用しようとしています。c#コードでcpp dllを使用

私は、開始するためにthisの記事を続けました。

dllはCのファイル(チュートリアルのような)だけを使用していますが、cppファイルを使用するとうまく動作しません。

dumpbinツールを使用するエクスポートされた関数名が変更されたことがわかります。 たとえば、関数呼び出し 'next'は '?next @@ YAHH @ Z'に変更され、C#コードで呼び出そうとしているときにそれを見つけることができません。

私のdllのコードは次のとおりです。

__declspec(dllexport) 
int next(int n) 
{ 
    return n + 1; 
} 

C#コード

[DllImport("lib.dll", CallingConvention = CallingConvention.Cdecl)] 
    extern static int next(int n); 

その同じコードCファイルまたはCPPファイル事前に

感謝を使用している間 Amichai

+0

extern "C" __declspec(dllexport) int next(int n) { return n + 1; } 

もっとあなたのコードを投稿してください。 – wdosanjos

+0

私はあなたがcppによって何を意味するのか理解していません。 –

+0

@wdosanjos、ありがとう。質問に自分のコードを追加しました。 – amichai

答えて

2

あなたがしようとしているのはトランポリン関数を作成して、C++オブジェクトの使用を外部化することです。

あなたが経験していることは、シンボルマングリングと呼ばれています。これは、多態性を可能にするために、ダイナミックライブラリと実行可能ファイル内のシンボル(関数など)に名前を付けるC++固有の方法です。

あなたはちょうどこのように、あなたのライブラリのコードでextern "C"文を使用して、マングリング効果をキャンセルするように指定する必要があります。このhere: Exporting functions from a DLL with dllexport

+1

ありがとうございました。とても助けてくれました – amichai

0

エントリーポイント

を入力してください

[DllImport("lib.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "next", CharSet = CharSet.Ansi)] 
static extern int next(int n); 

以下の例では、うまくいけば、それは役立ちます。

関連する問題