The internal (accessible from within the same assembly) and external (accessible from outside the assembly) for a member of a public class can differ.
Remarks
You can specify the accessibility of a type member using pairs of access specifiers selected from public, protected, and private.
The following table summarizes the effect of the various access specifiers
| Specifier | Effect | 
|---|---|
|  | Member is accessible inside and outside the assembly. See public (C++) for more information. | 
|  | Member is accessible neither inside nor outside the assembly. See private (C++) for more information. | 
|  | Member is accessible inside and outside the assembly, but only to derived types. See protected (C++) for more information. | 
|  | Member is public inside the assembly but private outside the assembly. internal is a context sensitive keyword. For more information, see Context-Sensitive Keywords. | 
|  | Member is public inside the assembly but protected outside the assembly. | 
|  | Member is protected inside the assembly but private outside the assembly. | 
Example
The following sample shows a public type with members declared with the different accessibilities, and accesses those members from inside the assembly.
// type_member_visibility.cpp
// compile with: /clr
using namespace System;
// public type, visible inside and outside the assembly
public ref class Public_Class {
public:
   void Public_Function(){System::Console::WriteLine("in Public_Function");}
private:
   void Private_Function(){System::Console::WriteLine("in Private_Function");}
protected:
   void Protected_Function(){System::Console::WriteLine("in Protected_Function");}
internal:
   void Internal_Function(){System::Console::WriteLine("in Internal_Function");}
protected public:
   void Protected_Public_Function(){System::Console::WriteLine("in Protected_Public_Function");}
public protected:
   void Public_Protected_Function(){System::Console::WriteLine("in Public_Protected_Function");}
private protected:
   void Private_Protected_Function(){System::Console::WriteLine("in Private_Protected_Function");}
protected private:
   void Protected_Private_Function(){System::Console::WriteLine("in Protected_Private_Function");}
};
// a derived type, will call protected functions
ref struct MyClass : public Public_Class {
   void Test() {
      Console::WriteLine("=======================");
      Console::WriteLine("in function of derived class");
      Protected_Function();
      Protected_Private_Function();
      Private_Protected_Function();
      Console::WriteLine("exiting function of derived class");
      Console::WriteLine("=======================");
   }
};
int main() {
   Public_Class ^ a = gcnew Public_Class;
   MyClass ^ b = gcnew MyClass;
   a->Public_Function();
   a->Protected_Public_Function();
   a->Public_Protected_Function();
   // accessible inside but not outside the assembly
   a->Internal_Function();
   // call protected functions
   b->Test();
   // not accessible inside or outside the assembly
   // a->Private_Function();
}
in Public_Function in Protected_Public_Function in Public_Protected_Function in Internal_Function ======================= in function of derived class in Protected_Function in Protected_Private_Function in Private_Protected_Function exiting function of derived class =======================
Now let's build the previous sample as a DLL.
// type_member_visibility_2.cpp
// compile with: /clr /LD
using namespace System;
// public type, visible inside and outside the assembly
public ref class Public_Class {
public:
   void Public_Function(){System::Console::WriteLine("in Public_Function");}
private:
   void Private_Function(){System::Console::WriteLine("in Private_Function");}
protected:
   void Protected_Function(){System::Console::WriteLine("in Protected_Function");}
internal:
   void Internal_Function(){System::Console::WriteLine("in Internal_Function");}
protected public:
   void Protected_Public_Function(){System::Console::WriteLine("in Protected_Public_Function");}
public protected:
   void Public_Protected_Function(){System::Console::WriteLine("in Public_Protected_Function");}
private protected:
   void Private_Protected_Function(){System::Console::WriteLine("in Private_Protected_Function");}
protected private:
   void Protected_Private_Function(){System::Console::WriteLine("in Protected_Private_Function");}
};
// a derived type, will call protected functions
ref struct MyClass : public Public_Class {
   void Test() {
      Console::WriteLine("=======================");
      Console::WriteLine("in function of derived class");
      Protected_Function();
      Protected_Private_Function();
      Private_Protected_Function();
      Console::WriteLine("exiting function of derived class");
      Console::WriteLine("=======================");
   }
};
The following sample consumes the component created in the previous sample, showing how to access the members from outside the assembly.
// type_member_visibility_3.cpp
// compile with: /clr
#using "type_member_visibility_2.dll"
using namespace System;
// a derived type, will call protected functions
ref struct MyClass : public Public_Class {
   void Test() {
      Console::WriteLine("=======================");
      Console::WriteLine("in function of derived class");
      Protected_Function();
      Protected_Public_Function();
      Public_Protected_Function();
      Console::WriteLine("exiting function of derived class");
      Console::WriteLine("=======================");
   }
};
int main() {
   Public_Class ^ a = gcnew Public_Class;
   MyClass ^ b = gcnew MyClass;
   a->Public_Function();
   // call protected functions
   b->Test();
   // can't be called outside the assembly
   // a->Private_Function();
   // a->Internal_Function();   
   // a->Protected_Private_Function();
   // a->Private_Protected_Function();
}
in Public_Function ======================= in function of derived class in Protected_Function in Protected_Public_Function in Public_Protected_Function exiting function of derived class =======================