2012-01-11 65 views
1

私はC++/CLIの構文を理解して時間を持っています。C++/CLIでInterfaceにキャストするにはどうすればよいですか?

gcroot<Object^> m_DotNetContextFactory; 

私はIContextFactoryインターフェイスにこのオブジェクトをキャストしたい:私はそうのように定義されたメンバ変数を持っています。

私はC#であった場合、私は単純に次の操作を行います:

object contextFactory = ...; 
IContextFactory contextFactory = (IContextFactory)contextFactory; 

任意のアイデア?

+0

管理C++では?代わりにC++/CLIを使わないのはなぜですか? – Arafangion

+0

私の無知のために私を許しなさい。私は正直なところマネージC++とC++/CLIの違いを知らない。たぶん私はC + +/CLIを使用しています。私が持っているものは、.NETに徐々に変換している既存のC++/COMコードです。私が変更しているこのC++コードでは、それをファサードに変換し、新しい.NET C#コンポーネントへの呼び出しをルーティングしています。最終的には、このC++クラスは廃止されますが、現在は、それに依存する他のCOMコンポーネントへの影響を減らそうとしています。それは少し良い背景を与えるか? – bsh152s

答えて

2

ダブルキャストがいるので必要ですあなたはObject ^を根絶した。私はそれがここの問題だと考えています。たとえば、次のように

#include "stdafx.h" 
#include <msclr\gcroot.h> 
using namespace msclr; 
using namespace System; 

class native { 
public: 
    gcroot<Object^> m_foo; 
}; 

interface class IBar {}; 
ref class managed : IBar {}; 


int main(array<System::String ^> ^args) 
{ 
    native* nobj = new native; 
    managed^ mobj = gcnew managed; 
    nobj->m_foo = mobj; 
    IBar^ itf = (IBar^)(Object^)nobj->m_foo; 
    return 0; 
} 

またはヘルパー変数とそれが少し読みやすく:

Object^ foo = nobj->m_foo; 
    IBar^ itf = (IBar^)foo; 
+0

ありがとうございます。それがトリックでした。しかし、メンバー変数にgcrootを使用する必要はありませんか?私はそれが私がここで読んだものだと思った - http://weblogs.asp.net/kennykerr/archive/2005/07/12/Mixing-Native-and-Managed-Types-in-C_2B002B00_.aspx。 – bsh152s

+0

何を言っているのか分かりませんが、確かにキャスティングインターフェイスとは何の関係もありません。新しい質問を開始してください。 –

関連する問題