.NET 包装器到 C++ 代码:CS0122 由于其保护级别错误而无法访问

.NET Wrapper to C++ code: CS0122 is inaccessible due to its protection level error

我正在尝试构建一个 C++/CLR 包装器以从 C# .Net 应用程序内部调用我的 C++ 代码。

以下是遵循的步骤:

C++ 项目:

cppproject.h

#ifndef _CPPPROJECT_H
#define _CPPPROJECT_H


typedef enum {
    SUCCESS,
    ERROR
} StatusEnum;

namespace cppproject
{
    class MyClass {

    public:
        MyClass();
        virtual ~MyClass();
        StatusEnum Test(); 

    };
}

#endif 

cppproject.cpp

#include "cppproject.h"

namespace cppproject {

    MyClass::MyClass() {};
    MyClass::~MyClass() {};

    StatusEnum MyClass::Test() 
    { 
        return SUCCESS;
    }

} 

现在将 C# 和 C++ 结合在一起的包装器项目(C++/CLR 类型):

wrapper.h

// wrapper.h

#pragma once

#include "cppproject.h"

using namespace System;

namespace wrapper {

    public ref class Wrapper
    {
        public:
            /*
             * The wrapper class
             */
            cppproject::MyClass* wrapper;

            Wrapper();
            ~Wrapper();

            StatusEnum Test();
    };
}

wrapper.cpp

// This is the main DLL file.

#include "stdafx.h"

#include "wrapper.h"

namespace wrapper {

    Wrapper::Wrapper()
    {
        wrapper = new cppproject::MyClass();
    }

    Wrapper::~Wrapper()
    {
        delete wrapper;
    }

    StatusEnum Wrapper::Test() 
    { 
        return wrapper->Test(); 
    };
}

最后是 C# 代码,我在其中遇到错误:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using wrapper;


namespace netproject
{
    /*
     * Enums
     */
    public enum StatusEnum {
        SUCCESS,
        ERROR
    };

    public partial class netproject
    {
        public const int MAX_REPORT_DATA_SIZE = 1024;
        public wrapper.Wrapper wrapper;

        public netproject() { wrapper = new wrapper.Wrapper(); }
        ~netproject() { wrapper = null; }

        public StatusEnum Test() 
        { 
            var sts = wrapper.Test(); <<- ERROR
            return (netproject.StatusEnum) sts;<<- ERROR 
        }
    }
}

C# 项目的编译器错误:

error CS0122: 'wrapper.Wrapper.Test()' is inaccessible due to its protection level
error CS0426: The type name 'StatusEnum' does not exist in the type 'netproject.netproject'

我不明白。 Test 在包装器项目和 C++ 项目中都被定义为 public。并且 StatusEnum 在错误行上方的 C# 项目中也是 public。

感谢帮助了解这里发生了什么....

typedef enum {
    SUCCESS,
    ERROR
} StatusEnum;

这不是在 C# 中可以访问的东西。在我看来,您有两个选择:

1) 您可以使枚​​举成为托管枚举。

public enum class StatusEnum {
    SUCCESS,
    ERROR
};

2) 我通常不喜欢只有两个值的枚举。在许多情况下,布尔值也同样有效。

public ref class Wrapper
{
    // returns true on success.
    bool Test();
};