У меня есть приложение (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);
Как я могу получить доступ ко второй функции?
1 ответ
Вероятно, это связано с тем, что нативные типы (в данном случае CRect) по умолчанию считаются закрытыми. Таким образом, хотя метод доступен, тип параметра для rc недоступен. Вы можете сделать его доступным с помощью make_public: http://msdn.microsoft.com/en-us/library/ms235607.aspx
Найдите C3767 и make_public, и вы найдете много другой информации по этой теме.
#pragma make_public (CRect)
должно работать. Если CRect принадлежит пространству имен, его также следует записать, например NAMESPACE::CRect
make_public
. Иногда я забываю об этом и схожу с ума.
Похожие вопросы
Связанные вопросы
Новые вопросы
visual-c++
Microsoft Visual C++ — это компилятор C, C++ и C++/CLI для Windows. Самая последняя версия компилятора — Visual C++ 2022. Компилятор поддерживает следующие языки: C (поддерживает C90 и большинство частей C99, C11, C17 стандарта ISO C++ по состоянию на Visual Studio 2022); C++ (поддержка большинства функций C++11, C++14, C++17 и C++20 и нескольких функций C++23 по состоянию на Visual Studio 2022) C++/CLI (обеспечивает взаимодействие с языками .NET, такими как C#).
c++-cli
, так как это поможет вам больше./clr
, верно? А не с#pragma unmanaged
(или эквивалентом)? Я думаю, у вас проблемы с идентификацией, поскольку собственные классы должны быть скомпилированы в ссылки типа MSIL, чтобы их можно было использовать в методах управляемых типов, ноCRect
в DLL - это тип, отличный отCRect
в EXE.