2011-01-12 36 views
3

私はC++の機能を使用しています。消費するためにC#に公開したいのです。キャッチは、C++コードの宣言は、名前空間に包まれていることを次のとおりです。名前空間を使用してC++と相互運用する方法

namespace OhYeahNameSpace 
{ 
extern "C" __declspec(dllexport) void Dummy(); 
} 

私の質問は、どのように対応するC#の構造を定義するのですか?私はC#のコードはOhYeahNameSpaceの存在を認識しなければならないと信じています、そうですか?

編集:多くの人が私の意見を誤解していると思います(私の元の例では、入力ミスのために感謝していません)。私は、エクスポートされた関数が存在する名前空間がある場合、どうやって行くのかを尋ねています。 1つの答えがこの部分に欠けている、もう1つはこれを行うことができないと私にそれを囲むように依頼し、もう1つは現在現在-1票あります。

+0

+1の "OhYeahNameSpace" – Maxpm

答えて

3

なぜC++/CLIでラップしないのですか?一つの可能​​な解決策が既にC++で

C++/CLIクラスで1つのラッピングを述べたほか(P /呼び出しを使用することです

//ohyeah.h 
namespace OhYeahNameSpace 
{ 
    public ref class MyClass 
    { 
    void Dummy(); 
    } 
} 

//ohyeah.cpp 
#include "ohyeah.h" 
namespace OhYeahNameSpace 
{ 
void MyClass::Dummy() 
{ 
// call the real dummy in the DLL 
} 

} 
+0

私はできますが、最も重要なことは、C#(別のC++ではない)から呼び出す方法です。 – Graviton

+0

これは正解です。 P/Invokeは、名前のマングリングを防ぐために 'extern" C "'を意味する "C"インターフェースを持つ関数を呼び出すためにのみ使用するべきです。また、パラメータと戻り値の型にも制限があります。 –

+1

@Benこの答えでは、 'Namespace'はC#コードに入りません(C#コードはありません)。これは答えになる可能性があると確信しています。 – Graviton

0

(私はあなたの関数は、名前のDLLが得られたプロジェクトであると仮定UnmanagedCpp.dll:C#で

namespace OhYeahNameSpace 
{ 
    extern "C" __declspec(dllexport) void Dummy(); //extern "C" to disable name mangling 
} 

class Program 
{ 
     [DllImport("UnmanagedCpp.dll")] 
     public static extern void Dummy(); 

     static void Main(string[] args) 
     { 

      Dummy(); 
     } 
} 

C#のアプリはABLする必要がありますeを使用してUnmanagedCpp.dll(つまり、あなたは)exeファイルのビンに

EDITそれをコピーすることができます。

このソリューションは、考慮すべきいくつかの欠点があります。コメントの後、私の "解決策"を提案するときに明確に述べなかったことがいくつかあります。

  1. C++/CLIでのラッピングが望ましいソリューションです。
  2. 現在、関数がextern "C"でエクスポートされている場合、VS 2010コンパイラ(およびその前身)は名前空間で関数の名前マングリングを無効にします。しかしこれはバグであると考えられ、これは将来、いつか修正される可能性があることを意味します。私は彼らがするまで私の息を止めません... commentersのバグ1は、2005年と5年後に報告されているリンクを提供しました...現在の動作の他に、IMHOのようなものです。もし名前が適切に装飾されていれば(名前空間の名前も含めて)、それをextern "C"と宣言してはなりません。しかし、それは私の個人的な意見です。だからこれを考慮してください。
+0

@ ds27680を使っているように、あなたは 'OhYeahNameSpace'がC#で*指定されていないことを知る限り、C#は' Dummy'関数を探す場所を知っています? – Graviton

+1

これは動作しません。 DLLエクスポートテーブル内の関数の名前は、 'Dummy'やp/invokeが処理する方法を知っている単純なバリエーションではありません。名前を調べて 'DllImport'属性で使用することもできますが、C++ DLLが再コンパイルされるたびに破損する可能性があります。 –

+0

[このバグ報告](http://support.microsoft.com/kb/140357)はソリューションに適用しないでください。 –

1

Cとしてラップし、P /呼び出しを使用します。

--- OhYeahNameSpace_C.h --- 
#ifdef __cplusplus 
extern "C" { 
#endif 

void _declspec(dllexport) OhYeahNameSpace_Dummy(); 

#ifdef __cplusplus 
} 
#endif 

--- OhYeahNameSpace_C.c --- 
#include "OhYeahNameSpace_C.h" 
#include <OhYeahNameSpace.h> 

void OhYeahNameSpace_Dummy() 
{ 
    ::OhYeahNameSpace::Dummy(); 
} 

を例は、100%完全ではありませんが、あなたはそれの要点を取得します。