Skip to content
/

“CS0122: ‘x’ is inaccessible due to its protection level” but you don’t want to go public

Sometimes you have to split your code into different assemblies. For example, when I created a custom Admin Page which inherits from WebAdminPageBase (Microsoft.SharePoint.ApplicationPages).

The problem with Microsoft.SharePoint.ApplicationPages is that it’s not deployed to the GAC.

Putting a reference to this assembly from my assembly, also containing custom web parts and other controls which have to be registered as SafeControls in the web.config, will result in deployment troubles when you use a WSP file. The problem is when SharePoint is going to register the safecontrols, it will reflect your assemby and will not be able to access the Microsoft.SharePoint.ApplicationPages assembly because it is not available in the GAC.
The same problem can be found using the Content Deployment option.

So, you split your code in 2 assemblies, for example foo.bar and foo.bar.ApplicationPages. But when your custom application page is depending on an internal type declared in foo.bar you are in trouble. When compiling you will get the following message:

"CS0122: 'foo.bar.x' is inaccessible due to its protection level"


Now you have only one choice: make x public. Or maybe not?

The solution

It is also possible to make your assembly share their internals with other assemblies. Add the following to you code (in foo.bar):

[assembly: InternalsVisibleTo("foo.bar.ApplicationPages, PublicKey=0a240a ... c2f34c7")]

But the public key is not your public key token. Thanks to Burt Harris’s comment at the InternalsVisibleToAttribute class, you can find your real public key using the following command:

sn.exe -Tp foo.bar.dll


Now compile your project and there you go!