C # не распознает пространство имен C ++ / CLI без файла .cpp - PullRequest
0 голосов
/ 07 марта 2019

У меня есть решение 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 # может видеть пространство имен, а не первый случай?

...