2013-05-13 5 views
2

Мое положение это.Сбой компиляции C# из-за «из-за его уровня защиты»

У меня есть 3 проекта.

PrivacyDetectorDLL PDWrapper WindowsFormsApplication1 (C#)

Моя цель состоит в том, чтобы использовать класс Native C++ в 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 

Мой код c из проекта WindowsFormsApplication1 - это.

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 проекта)

#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;  
}; 

Мой PrivacyDetectEngine заголовок из PrivacyDetectorDLL такой же, но есть __declspec (dllexport) между классом CPrivacyDetectEngine как

class __declspec(dllexport) CPrivacyDetectEngine 

Я понятия не имею, в чем проблема .... Кто-то, пожалуйста, помогите мне.

+0

Вы перестроили все проекты? – SLaks

+0

Mark 'class CPrivacyDetectEngine' как' public class CPrivacyDetectEngine'. – Saravanan

ответ

5

Ваш класс «обертка» не выполняет свою работу.

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, который вызывает целую последовательность встроенных функций.

Рассмотрите возможность использования интеллектуального указателя, чтобы убедиться, что родной объект свободен во всех случаях. Например, я опубликовал a smart pointer on codereview.se. Пожалуйста, соблюдайте лицензию, если вы ее используете; условия довольно щедры, но налагают некоторые требования к атрибуции.

Смежные вопросы