C++, вызывающий функцию ref-класса (смешанный код)

У меня есть приложение (CLI), которое ссылается на смешанную DLL. DLL реализует класс "ref" со статическими функциями.

Вот (частичный) код для ref-класса

public ref class AAA
{
public:
static bool Write(System::String^ sz);

// Not accessible!!!
public: static BOOL TraceRect(const CRect& rc);
};

В EXE в коде C++ я пытаюсь вызвать обе функции:

// This works
AAA::Write("hello");

// This doesn't !!!
CRect rc(0, 0, 12, 234);
AAA::TraceRect(rc);

Как я могу получить доступ ко второй функции?


person Seb    schedule 11.04.2011    source источник
comment
Это не похоже на C++ для меня.   -  person John Dibling    schedule 11.04.2011
comment
Добавлен тег c++-cli, так как это поможет вам больше.   -  person Xeo    schedule 11.04.2011
comment
Просто дикая догадка, но вы поместили неуправляемые типы данных в статический метод для управляемого класса. Кроме того, «const» не поддерживается CLR, поэтому я не уверен, как он будет интерпретировать его при компиляции класса в IL. Я бы разделил ваши общедоступные неуправляемые статические методы в отдельное место, а не пытался поместить их в управляемый класс.   -  person Dan Bryant    schedule 11.04.2011
comment
Определить не работает. Ошибка компиляции? Ошибка выполнения? Пожалуйста, покажите сообщение об ошибке и укажите, в какой строке кода она возникла.   -  person Ben Voigt    schedule 11.04.2011
comment
Это не совсем C++, но этот код находится в OnInitDialog C3767.   -  person Seb    schedule 11.04.2011
comment
(еще не хотел "добавить комментарий")... Ошибка компиляции на уровне приложения - C3767. Пишет, что функция недоступна.   -  person Seb    schedule 11.04.2011
comment
ОБНОВЛЕНИЕ: я удалил 'const'... и все еще получаю ту же ошибку в строке: AAA:TraceRect(rc);   -  person Seb    schedule 11.04.2011
comment
@Себ; Код, выполняющий вызов, скомпилирован с помощью /clr, верно? А не с #pragma unmanaged (или эквивалентом)? Я думаю, вы сталкиваетесь с проблемами идентификации, поскольку собственные классы должны быть скомпилированы в ссылки типа MSIL, чтобы их можно было использовать в методах управляемых типов, но CRect в DLL отличается от CRect в EXE.   -  person Ben Voigt    schedule 11.04.2011
comment
возможный дубликат функции-кандидата C++ CLI не доступен   -  person Ben Voigt    schedule 11.04.2011
comment
Да, я использую /clr... без прагмы unmanaged... Я просто пытаюсь создать класс-мост, который получает нативные типы, возможно ли это?   -  person Seb    schedule 11.04.2011


Ответы (1)


Вероятно, это связано с тем, что нативные типы (в данном случае CRect) по умолчанию считаются закрытыми. Таким образом, хотя метод доступен, тип параметра для rc недоступен. Вы можете сделать его доступным с помощью make_public: http://msdn.microsoft.com/en-us/library/ms235607.aspx

Найдите C3767 и make_public, и вы найдете много другой информации по этой теме.

person Matt Smith    schedule 11.04.2011
comment
Хорошая идея, но она не работает. Я даже пытался изменить «CRect» на «RECT»… теперь DLL даже не связывается, я получаю LNK2022 (метаданные). - person Seb; 11.04.2011
comment
Попробуйте свести это к тому, что вызывает проблему. У вас возникнет проблема, если она не принимает параметры no. Переключение между CRect и RECT на самом деле не означает попытки сделать что-то новое — они оба по-прежнему нативные типы. - person Matt Smith; 11.04.2011
comment
@Seb: #pragma make_public (CRect) должно работать. Если CRect принадлежит пространству имен, его также следует записать, например NAMESPACE::CRect - person ali_bahoo; 12.04.2011
comment
+1 за make_public. Иногда я забываю об этом и схожу с ума. - person ali_bahoo; 12.04.2011
comment
Хорошо... Я использовал MS-Dev 2005... Попробовал это на MS-Dev 2010 и обнаружил, что все работает нормально! Когда я снова открыл свое рабочее пространство в MS-Dev 2005... это сработало! Так что я думаю, что решение было: выгрузить и перезагрузить проект ;) Спасибо всем, кто пытался помочь, это было очень ценно! - person Seb; 12.04.2011