.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();
};
我正在尝试构建一个 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();
};