A custom Roslyn compiler that allows access to internals/privates in other assemblies.
This package contains a custom Roslyn compiler. If the package is installed in a c# project, it will override the compiler used in the build.
The custom compiler automatically injects IgnoresAccessChecksToAttribute
to the assembly.
This attribute ignores accessibility to the assembly with the given name.
In other words, you can access to internals/privates in other assemblies, without reflection feature.
Have you ever heard of a secret attribute IgnoresAccessChecksToAttribute
?
For more information, See the great article by Filip W.
If you use an assembly (*.dll) generated by the OpenSesame compiler in another project, you do not need to use the OpenSesame compiler again.
This means that a "bridge" assembly to another assembly can be easily generated.
- Change the names of the packages
Microsoft.*
toOpenSesame.*
- Allow unsafe code automatically (for .Net Framework)
- With
MetadataImportOptions.All
for compilation options - With
BinderFlags.IgnoreAccessibility
for compilation options - Inject
IgnoresAccessChecksToAttribute
class automatically
- Support C# 8.0
- .Net Framework 4.7 or later
- .Net Core 2.0 or later
- .Net Standard 2.0 or later
- Unity 2018.3 or later
Package Name | Original Package | Version | Downloads |
---|---|---|---|
OpenSesame.Net.Compilers.Toolset | Microsoft.Net.Compilers.Toolset | ||
OpenSesame.Net.Compilers (deprecated) | Microsoft.Net.Compilers | ||
OpenSesame.NetCore.Compilers (deprecated) | Microsoft.NetCore.Compilers |
For a C# project (*.csproj
), you can install the Toolset package to change the compiler to be used at build time.
- Install the nuget package OpenSesame.Net.Compilers.Toolset to the project.
- The accessibility of all symbols (types, methods, properties, etc.) will be ignored.
For a C# project (*.csproj
), you can install the Toolset package to change the compiler to be used at build time.
- Install the nuget package OpenSesame.Net.Compilers.Toolset to the project.
- Adddd the following somewhere in your code:
[assembly: System.Runtime.CompilerServices.IgnoresAccessChecksTo("<TargetAssemblyName>")]
- The accessibility of the symbols (types, methods, properties, etc.) contained in the
<TargetAssemblyName>
will be ignored.
Use a unity package com.coffee.open-sesame-compiler.
Use reflection
Use Csc-Manager to modify your VisualStudio Code and C# extension.
- csc-manager enable-vscode: Show internals/privates in other assembly.
- csc-manager disable-vscode: Hide them.
When Program.cs is compiled by OpenSesame.Net.Compilers.Toolset
, the changes are as follows:
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
+using System.Security;
+using System.Security.Permissions;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
+[assembly: IgnoresAccessChecksTo("PrivateLibrary")]
[assembly: TargetFramework(".NETCoreApp,Version=v3.1", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("PrivateLibrary.Console")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("PrivateLibrary.Console")]
[assembly: AssemblyTitle("PrivateLibrary.Console")]
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
+[module: UnverifiableCode]
+namespace System.Runtime.CompilerServices
+{
+ [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
+ public class IgnoresAccessChecksToAttribute : Attribute
+ {
+ public string AssemblyName
+ {
+ get;
+ }
+
+ public IgnoresAccessChecksToAttribute(string assemblyName)
+ {
+ AssemblyName = assemblyName;
+ }
+ }
+}
namespace PrivateLibrary.Console
{
internal class Program
{
private static void Main(string[] args)
{
System.Console.WriteLine(new InternalClass().privateStringField);
}
}
}
OpenSesame | Roslyn |
---|---|
If a new stable version of the Rosly package has been released, please update Roslyn.
Create an issue using the Roslyn update request issue template
./tool.sh --pack --run-tests
When push to main
or v*.x
branch, this package is automatically released by GitHub Action.
- Update version of the package
- Update and push CHANGELOG.md
- Create version tag
- Release on GitHub
- Publish to nuget registory
Alternatively, publish packages manually with the following command:
./tool.sh --pack --run-tests --publish --token <NUGET_TOKEN>