我有一个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文件。该程序运行没有问题:
新的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#可以看到名称空间,而在第一种情况下却看不到?