C ++からのC#の呼び出し、 "。"の難しさC#名前空間で

まず、私はこれをちょっと貨物栽培していると認めます。私が実際の世界にそれを詰め込んでいるとき、私のきれいなサンプルコードはうまくいきません。それは言っている...

私はCPierce.CSharpCall.dllと呼ばれるDLLを持っています。このDLLには、次のようなC#があります。

namespace CPierce.CSharpBridge
{
    [System.Runtime.InteropServices.Guid("3D08DF02-EFBA-4A65-AD84-B08ADEADBEEF")]
    public interface ICSide
    {
       //interface definition omitted...
    }
    [System.Runtime.InteropServices.Guid("CBC04D81-398B-4B03-A3D1-C6D5DEADBEEF")]
    public partial class CSide : ICSide
    {
       //class definition omitted...
    }
}

これは regasm/tlb などで登録されています。そして、私のC ++コードは次のようになります:

#import "CPierce.CSharpCall.tlb" named_guids

   //Contains syntax errors!
int myfunc()
{
    HRESULT hRes = S_OK;
    CoInitialize(NULL);
    CPierce.CSharpBridge::ICSide *pManagedInterface = NULL;

    hRes = CoCreateInstance(
            CPierce.CSharpBridge::CLSID_Class1, 
            NULL, CLSCTX_INPROC_SERVER, 
            CPierce.CSharpBridge::ICSide, 
            reinterpret_cast (&pManagedInterface));

   //Calls to the interface omitted....

    CoUninitialize();
    return 0;
}

問題は、もちろん、 CPierce.CSharpBridge に関する構文上間違ったビットです。私はC ++で、C#コードと同様の名前空間を使用したいと思うかどうかを知ることができます。

namespace CPierce
{
    namespace CSharpBridge
    {
       //definitions go here
    }
}

しかし、私がここで探しているとは思っていません。別の名前空間にある2つの定数を、その名前空間にメソッド全体を入れずに参照するだけでよいからです。

CoCreateInstance の呼び出しを完了するために必要なC ++構文はあります


アップデート:より深い(もっと深い)検査では、regasmによって作成された.tlbファイルがほとんど空であることがわかりました。私のソースのすべてを単一の.csファイルにまとめ、コンパイルすると、次のようになります。

csc /debug /t:library BigFile.cs 
regasm BigFile.dll /tlb:BigFile.tlb

私はかなりの(そして便利な)tlbファイルを取得します。

私がVisual Studioからプロジェクト全体をコンパイルすると、.DLLは正常ですが、regasmは何もしませんが最小限の.tlbファイルを生成します。 (ildasmは2つのDLLの間にほとんど違いがないことを示しています)

私がVisual StudioでBigFile.csをコンパイルすると、役に立たないDLLが得られます。

私は困惑している。

1
ネストされた名前空間を持たない場合は機能しますか?
追加された 著者 Gabe,
うん。何か変だけど...オブジェクトブラウザの.tlbをクリックすると、CPierce_CSharpBridgeと表示されます。今、CPierce_CSharpBridge :: ICSideは「ICSideはPR1_CSharpBridgeのメンバーではありません」と戻ります。とにかく、解決されていません。
追加された 著者 Clinton Pierce,
私の問題は少し深刻かもしれませんが、.tlbファイルにはほとんど何もありません。私のタイプ/インターフェースが完全に登録されているかどうかはわかりません。 regasmはエラーを出すことはありませんが、有用な.tlbが得られません。私はデフォルトのコンストラクタを持っています... regasmをより近く見る時間。
追加された 著者 Clinton Pierce,
の代わりに :: を使ってみましたか?
追加された 著者 Random832,
私のために "。" regasmでtlbを生成するときに "_"に置き換えられました。 Visual Studioでtlbファイルを開くだけで問題が示されました。
追加された 著者 uli78,

2 答え

C ++では、演算子を使用して名前空間を区切りません。 :: を使用します。 CPierce.CSharpBridge の代わりに CPierce :: CSharpBridge を使用します。残念ながら、実際にTLBがどの名前空間を生成しているのかわからないため、これは役に立ちません。

そのための簡単な解決策は、名前空間をまったく使用せず、それらを使わずにインポートすることです。

#import "CPierce.CSharpCall.tlb" named_guids no_namespace
3
追加された
@clintp: CPierce :: CSharpBridge :: ICSide
追加された 著者 R. Martinho Fernandes,
@clintp:名前空間を無視しても問題ありませんか?
追加された 著者 Gabe,
Actaullyが CPierce.CSharpBridge :: ICSide を使用するように変更すると、クラスまたは名前空間の名前ではないエラーが表示されます。申し訳ありませんが、私もそれを試しました。
追加された 著者 Clinton Pierce,
ええ、申し訳ありません、それは私がタイプすることを意味しました。すべてのコロンは、まだエラーです。
追加された 著者 Clinton Pierce,
@clintp - あなたの質問を更新し、あなたが現在使っているものとあなたが受け取った正確なコンパイルエラーを投稿してください。私はdllがある場所にあり、あなたが正しい方法でそれにリンクしていると仮定します。あなたはそれほど助けを必要としないようです。
追加された 著者 Security Hound,

これはC#/ Visual Studio側の問題です。私はこの質問を断念し、適切なものを開きます。それを絞り込んでいただきありがとうございます。

0
追加された