Как выполнить приведение к интерфейсу в C++/CLI?

У меня чертовски много времени на понимание синтаксиса C++/CLI. У меня есть переменная-член, определенная так:

gcroot<Object^> m_DotNetContextFactory;

Я хотел бы передать этот объект интерфейсу IContextFactory.

Если бы я был на C#, я бы просто сделал следующее:

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

Любые идеи?


person bsh152s    schedule 11.01.2012    source источник
comment
В управляемом С++? Почему бы вам вместо этого не использовать C++/CLI?   -  person Arafangion    schedule 12.01.2012
comment
Прости меня за мое невежество. Честно говоря, я не знаю разницы между управляемым C++ и C++/CLI. Возможно, я использую C++/CLI. У меня есть существующий код C++/COM, который мы медленно конвертируем в .NET. Для этого кода C++, который я изменяю, я преобразовываю его в фасад и перенаправляю вызовы на более новые компоненты .NET C#. Со временем этот класс C++ исчезнет, ​​но сейчас мы пытаемся уменьшить влияние на другие компоненты COM, зависящие от него. Это дает немного лучший фон?   -  person bsh152s    schedule 12.01.2012


Ответы (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;
person Hans Passant    schedule 11.01.2012
comment
Спасибо. Это помогло. Но разве мне не нужно использовать gcroot для моей переменной-члена? Я думал, что это то, что я прочитал здесь -- weblogs.asp.net/kennykerr/archive/2005/07/12/. - person bsh152s; 12.01.2012
comment
Понятия не имею, о чем вы говорите, наверняка это не имеет отношения к кастингу интерфейсов? Начать новый вопрос. - person Hans Passant; 12.01.2012

Если вы действительно имеете в виду C++/CLI, а не устаревший «управляемый C++», то я предлагаю использовать шаблон safe_cast, как намекает следующий вопрос:

C++/CLI-Вопрос: существует ли эквивалент ключевого слова C# is или мне нужно использовать отражение?

person Arafangion    schedule 11.01.2012