繁体   English   中英

由于“由于其保护级别”,C#编译失败

[英]C# compile fail because of “Due to its protection level”

我的情况是这样。

我有3个项目。

PrivacyDetectorDLL PDWrapper WindowsFormsApplication1(C#)

我的目标是在C#中使用Native C ++类。 因此,我使用了C ++ / Cli包装器类。 但是我得到保护级别的错误。 我不明白

我得到这个错误!

Error   1   'PDWrapper.PDWrapperClass.m_pCPrivacyDetectEngine' is inaccessible due to its protection level  K:\Visual Studio 2010 Project\PrivacyDetecter\WindowsFormsApplication1\Form1.cs 23

我来自WindowsFormsApplication1项目的c#代码是这样。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public PDWrapper.PDWrapperClass m_PDWrapper = null;

        public Form1()
        {
            m_PDWrapper = new PDWrapper.PDWrapperClass();

            unsafe
            {
                m_PDWrapper.m_pCPrivacyDetectEngine->initEngine();
            }

            InitializeComponent();
        }
    }
}

我的PDWrapper类看起来像这样。

// PDWrapper.h

#pragma once

using namespace System;

namespace PDWrapper {

    public ref class PDWrapperClass
    {
        // TODO: Add your methods for this class here.
    public :
        PDWrapperClass();
        ~PDWrapperClass();

    public :
        CPrivacyDetectEngine* m_pCPrivacyDetectEngine;
    };
}

这是我的PrivacyDetectEngine标头(来自PDWrapper Project的标头)

#pragma once
class CPrivacyDetectEngine
{
public: // my func
    CPrivacyDetectEngine(void);
    ~CPrivacyDetectEngine(void);

    void CPrivacyDetectEngine::initEngine();

    void CPrivacyDetectEngine::startEngine(char* currentPath, size_t length);

public: // my util func
    int CPrivacyDetectEngine::bytecmp(unsigned char *a, unsigned char *b, int length);
    void CPrivacyDetectEngine::extToNum(char* fileName, unsigned int* extNum);
    int CPrivacyDetectEngine::checkFileSig(unsigned char* fileSig, int sigLength, char* filePath, char** pFileInternal);
    void CPrivacyDetectEngine::parseMSDocText(char** pFileInternal, unsigned int* compSize, unsigned int* decompSize);
    char* CPrivacyDetectEngine::infData(char* pFileData, int compSize, int decompSize);
    void CPrivacyDetectEngine::privacyDetectXML(char* text, int textLength, int* pItemIndex, char* filePath);
    void CPrivacyDetectEngine::checkSocialNum(char* text);

public: // my var
    int driverCount;            
    char driverName[256];           
    unsigned int parseFileList;     
};

我来自PrivacyDetectorDLL的PrivacyDetectEngine标头是相同的,但是在类CPrivacyDetectEngine之间确实有__declspec(dllexport)

class __declspec(dllexport) CPrivacyDetectEngine

我不知道这是什么问题。...请有人帮助我。

您的“包装器”类没有完成其工作。

C#无法访问本机C ++类。 这是错误的根源。 指针是否存储在托管ref class没有关系。 尽管指针是公共的,但它指向的数据类型对C#隐藏(因为它不兼容)。

不过有一个解决方案。 C ++ / CLI可以很好地访问本机C ++类。 因此,您需要的是:

public ref class PDWrapperClass
{
    // TODO: Add your methods for this class here.
public :
    PDWrapperClass();
    ~PDWrapperClass();

private:
    CPrivacyDetectEngine* m_pCPrivacyDetectEngine;

public:
    void initEngine() { m_pCPrivacyDetectEngine->initEngine(); }
};

您需要对希望C#能够调用的每个函数执行此操作。 包装器不仅仅是指针持有人。 在许多情况下,您可以在C ++ / CLI ref class中提供一个方法,该方法调用整个本机函数序列。

但是,请务必考虑使用智能指针,以确保在所有情况下都释放本机对象。 例如,我在codereview.se上发布了一个智能指针 如果使用许可证,请务必遵守; 术语相当宽泛,但确实有一些属性要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM