此仓库参考 IgnoresAccessChecksToGenerator 自己动手实践,帮助理解原理。
-
生成
IgnoresAccessChecksToAttribute
特性,命名空间为System.Runtime.CompilerServices
,该特性只会在运行时会生效,在编译期间无效。namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] public sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { AssemblyName = assemblyName; } public string AssemblyName { get; } } }
-
创建一个AssemblyInfo.cs文件或随便在一个地方应用
IgnoresAccessChecksToAttribute
特性,表示忽略对该程序集的访问修饰符检查。[assembly: IgnoresAccessChecksTo("MyProject")]
-
生成一个新的 MyProject 程序集,将所有访问级别改为
public
。 -
将生成的新的程序集添加到当前项目中,需要在
AfterResolveReferences
Task之后,用于编译通过。<ItemGroup> <ReferencePath Include="新的程序集.dll" /> </ItemGroup>
-
移除旧的程序集引用,用于消除IDE的诊断错误提示和F12跳转到定义。
<ItemGroup> <ReferencePath Remove="旧的程序集.dll" /> </ItemGroup>