У меня есть решение CLR с проектом C #, на которое ссылается проект Managed C ++. Точка входа в C # - Program.cs:
using System;
using System.Runtime.ExceptionServices;
using ManagedCpp;
class Program
{
[HandleProcessCorruptedStateExceptions]
static void Main(string[] args)
{
ManagedClass mc = new ManagedClass();
}
}
ManagedCpp.h
#include "NativeClass.h"
namespace ManagedCpp {
public ref class ManagedClass
{
private:
NativeClass* _ptr = nullptr;
public:
ManagedClass() { _ptr = new NativeClass(); };
~ManagedClass() { if (_ptr) { delete _ptr; _ptr = nullptr; } };
void ThrowException() {
try
{
_ptr->ThrowException();
}
catch (std::exception e)
{
throw gcnew System::Exception(gcnew System::String(e.what()));
}
}
};
}
После компиляции проекта Managed C ++ и его запуска выдается эта ошибка:
Error CS0246 The type or namespace name 'ManagedCpp' could not be found (are you missing a using directive or an assembly reference?)
Однако, если я переместлю тела функций из ManagedCpp.h в файл ManagedCpp.cpp. Программа запускается без проблем:
New ManagedCpp.h
#include "NativeClass.h"
namespace ManagedCpp {
public ref class ManagedClass
{
private:
NativeClass* _ptr = nullptr;
public:
ManagedClass();
~ManagedClass();
void ThrowException() {
try
{
_ptr->ThrowException();
}
catch (std::exception e)
{
throw gcnew System::Exception(gcnew System::String(e.what()));
}
}
};
}
Новый файл ManagedCpp.cpp:
#include "stdafx.h"
#include "ManagedCpp.h"
ManagedCpp::ManagedClass::ManagedClass() { _ptr = new NativeClass(); }
ManagedCpp::ManagedClass::~ManagedClass() { if (_ptr) { delete _ptr; _ptr = nullptr; } }
Какая разница между этими двумя? Почему в последнем случае C # может видеть пространство имен, а не первый случай?