Question

I'm wondering if it's possible to access internal class variables from other project in c#. I know that is impossible in regular use, I explain it below.

I have one project (P1 [class library]) containing those classes...

internal class Settings
{
    public static long size {get;set;}

    public static DoSomethingInternalOnly()
    {
    }
}

public class Program
{
    public static Main()
    {

    }
}

... and another one (P2) containing:

public class Program
{
    public static Main()
    {
        //P1.CopyOfSettings.size = 2048; ???
    }
}

In Settings class I store internal variables (and methods) for app which cannot be visible from other projects. But those settings need to be passed somehow from P2 to P1 so I need second class "Settings2" in P2 containing the same variables (variables only!) as "Settings" with public keyword.

I feel that creating several classes containing the same variables is a waste of time and makes code unreadable. Is there better way to accomplish this?

Was it helpful?

Solution

You can use the InternalsVisibleTo attribute and provide the name of a specific assembly that can see the internal types in your assembly.

That being said.. I think you are bordering on over-designing this. If the Settings class belongs only to Assembly A... don't put it in Assembly B... put it in Assembly A.

OTHER TIPS

Yes it is, using InternalsVisibleTo, but I would only recommend doing this for Unit Test projects.

Otherwise, you should extract a common interface, make it public and put it in a separate assembly that can be references by both projects.

You could make all the properties of the interface read-only so that the consumer cannot change them.

Project containing the internal

In the .csproj:

<PropertyGroup>
  <AssemblyName>CompanyName.ProjectName</AssemblyName>
  <RootNamespace>CompanyName.ProjectName</RootNamespace>
</PropertyGroup>
<ItemGroup>
  <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
    <_Parameter1>CompanyName.ProjectNameTest</_Parameter1>
  </AssemblyAttribute>
</ItemGroup>

Project wishing to access the internal

In the .csproj:

<PropertyGroup>
  <AssemblyName>CompanyName.ProjectNameTest</AssemblyName>
  <RootNamespace>CompanyName.ProjectNameTest</RootNamespace>
</PropertyGroup>

That is the point of internal modifier - to not allow this. Either change it to public or use some kind of proxy class to expose the functionality you need to the outer world.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top