2011-02-25 4 views
1

CLR 콘솔 응용 프로그램에서 C++/CLI를 사용하여 간단한 DLL을 테스트하고 있습니다. DLL에는 사용하려는 함수가 하나뿐입니다. DLL을 참조하고 프로젝트 속성 페이지에서 Resusing #using Reference를 설정했지만 작성한 함수를 볼 수 없습니다. 나는 어딘가에 접근 수정자를 놓친 것 같지만 확실하지 않다.테스트 응용 프로그램에서 DLL 기능을 볼 수 없습니다.

DLL 코드 헤더 :

// LogDLL.h 

#pragma once 
#using <mscorlib.dll> 
using namespace System; 


namespace LogDLL { 

    public ref class LogFuncs 
    { 
     // TODO: Add your methods for this class here. 
     LogFuncs(){;}; 
     ~LogFuncs(){;}; 
     void log_to_file (System::String ^file, bool overwrite, System::String ^text); 
    }; 
} 

DLL 코드 출처 :

#include "stdafx.h" 
#include "LogDLL.h" 
using namespace System::Globalization; 

void LogDLL::LogFuncs::log_to_file (System::String ^file, bool overwrite, System::String ^text) 
{ 
    //Do Stuff 
} 

그리고 내가 사용 테스트 코드 :

여기 내 코드의 고장입니다
#include "stdafx.h" 
#using <LogDLL.dll> 
using namespace System; 

int main(array<System::String ^> ^args) 
{ 
    Console::WriteLine(L"Hello World"); 
    LogDLL::LogFuncs^ a; 
    a::LogDLL::LogFuncs:: //<-- Intellisense doesn't show the function from the DLL 
    return 0; 
} 

다시 말씀 드리지만, 저는 su가 아닙니다. 내가 뭘 놓치고 있는지. C++/CLI와 함께 작업 한 이래로 잠시였습니다. 그래서 나는 녹슨예요.

업데이트 : 내가 나서서 피터의 조언에 따라 구조체에 클래스를 변경

.

수정 DLL 헤더 코드 : 클래스가 아직도 내가 공개로 지정에도 불구하고 비공개로 기본 왜 무엇 난 아직도 이해가 안

// LogDLL.h 

#pragma once 
#using <mscorlib.dll> 
using namespace System; 


namespace LogDLL { 

    public ref struct LogFuncs 
    { 
     // TODO: Add your methods for this class here. 
     LogFuncs(){;}; 
     ~LogFuncs(){;}; 
     void log_to_file (System::String ^file, bool overwrite, System::String ^text); 
    }; 
} 

. 이것이 왜 그런지 근본적인 이유가 있습니까? 내가 관리되지 않는 C++를 사용했다면 다른 것이겠습니까 ??

답변

2

클래스의 기본 액세스 권한은 비공개입니다. 공개하려는 멤버에 대해 "public :"을 추가하거나 public의 기본 액세스 권한을 갖는 ref struct로 변경하십시오.

IntelliSense와 관련하여 Visual Studio 2005 또는 Visual Studio 2008을 사용하고 있다고 가정합니다. Visual Studio 2010은 IntelliSense for C++/CLI 코드를 지원하지 않습니다 (파서가 EDG로 대체 되었기 때문에 C++/CLI 구문 분석 기능을 2010 버전으로 다시 추가하지 않았기 때문입니다).

어쨌든 사용중인 구문으로 IntelliSense가 자동 완성 될지 의심 스럽습니다. 대신에 "a->"를 원할 것입니다 (당연히이 코드를 실행하기 전에 사용하십시오).

+0

고마워 피터, 나는 ref 구조체로 바꿨고 트릭을 만들었습니다. – kingrichard2005

+0

후속 질문에 대해서는 클래스 자체의 "public"은 멤버가 아닌 해당 유형의 표시 여부를 나타냅니다. "ref class LogFuncs"만 있으면 자체 어셈블리 외부에서 액세스 할 수 없습니다. 따라서 원하는 방식으로 다른 어셈블리에서 액세스 할 수있는 멤버는 공용 형식 (InternalsVisibleToAttribute 무시)이어야하며 멤버 자체는 공개되어야합니다. –

+0

혼란을 야기 할 수있는 추가 설명 : C++/CLI는 CLI (Common Language Infrastructure)의 개념에 C++을 그대로 적용하려고 시도했습니다. 따라서 C++/CLI, "ref class"및 "ref struct"에서 CLI 클래스 유형을 선언하는 두 가지 방법이 있습니다. 전자는 C++ 클래스처럼 동작합니다. 멤버에 대한 기본 개인 액세스입니다. 후자는 C++ 구조체처럼 동작합니다. 멤버에 대한 기본 공용 액세스입니다. "value class"와 "value struct"는 CLI 값 유형을 선언하는 것을 제외하고는 마찬가지입니다. –

관련 문제