Ответы с форумов MSDN

Подключение объектов из другого модуля в C++/CLI

Date: 23.02.2017 7:01:34

То, что вы хотите сделать, не работает.

Директива using позволяет лишь добавить в область видимости объекты из внешнего пространства имен. Она не отменяет необходимости объявления объекта, определенного в другом модуле (что и содержится в заголовочном файле).

Message 924

Date: 26.02.2017 13:53:34

Сборка System::Windows::Forms подключена к проекту как внешняя (на нее добавлена ссылка в свойствах проекта), поэтому ее определение берется из метаданных сборки и заголовочный файл не нужен. У управляемых сборок вообще нет ни заголовочных файлов ни библиотек импорта, поскольку все необходимые данные об экспортируемых объектах содержатся в самой сборке. 

Вам следует понять следующее: директива using не влияет ни на что, кроме видимости объектов. Все что она делает, это позволяет писать Form2 вместо MyProject::Form2, она не подключает никаких внешних объектов. В языке с++, использованию класса должно предшествовать его объявление, это правило. Если вы используете стандартную структуру проекта WinForms CLI: один модуль MyProject.cpp + сгенерированные конструктором Form1.h ... FormN.h, правильным способом обеспечить выполнение этого правила является включение в MyProject.cpp директив include в правильной последовательности. Например, если Form1 использует Form2, MyProject.cpp должен выглядеть так.

// MyProject.cpp: главный файл проекта.

#include "Form2.h"
#include "Form1.h"

using namespace MyProject;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
	// Включение визуальных эффектов Windows XP до создания каких-либо элементов управления
	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false); 

	// Создание главного окна и его запуск
	Application::Run(gcnew Form1());
	return 0;
}

Тогда в Form1.h мы можем использовать Form2 без каких-либо дополнительных директив:

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
{
	MyProject::Form2 ^ frm=gcnew MyProject::Form2();
	frm->Show(this);
}

Если же у вас несколько модулей, то классы должны разбиваться на объявление (в заголовках) и реализацию (в cpp-файлах), и опять, заголовки должны подключаться к модулям в правильной последовательности. Путаница тут возникает из-за того, что встречаются две разные иделогии подключения внешних объектов: управляемого кода (с автоматически загружаемыми метаданными) и неуправляемого кода (с требованием явного объявления объекта до его использования). Это приводит к забавному факту, что объект из внешней сборки подключить "проще" чем объект из своего проекта.



Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub