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

时间:2016-09-12 16:52:11

标签: c# c++ .net c++-cli wrapper

我正在尝试构建一个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 ++ / CLR类型)绑定在一起C#和C ++:

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 ++项目中都是公共的。 StatusEnum在错误行上方的C#项目中也是公开的。

帮助了解如何发现这里发生的事情......

1 个答案:

答案 0 :(得分:1)

typedef enum {
    SUCCESS,
    ERROR
} StatusEnum;

这不是C#中可以访问的内容。在我看来,你有两个选择:

1)您可以将枚举设为管理枚举。

public enum class StatusEnum {
    SUCCESS,
    ERROR
};

2)我通常不是只有两个值的枚举的粉丝。在许多情况下,布尔值也可以正常工作。

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