- You could use reflection to access the internals of Lib. This isn't a very nice solution.
- You could make Impl a friend assembly of Lib. This isn't a very nice solution.
- You could restructure your design to fix the need for Impl to access Lib's internals. This is the nice solution.
Using your example, here is an idea of what I'm getting at. Why not change the design to:
Assembly Lib:
Interface A;
Interface B; //Utilizes multiple properties with a { get; } pattern.
//Contains more interface definitions like Interface B
Assembly Impl: //References Lib
Class 123; //Utilizes multiple properties with a { get; internal set; }
//pattern. Implements B.
//Contains more class definitions like Class 123
Class MyImpl; //Implements Interface A and utilizes Class 123.
ClientApplication:
//Consumes implementations of Interface A and B provided by Impl.