簡體   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