|
@@ -18,31 +18,39 @@ public class RefAssemblyGenerator
|
|
|
|
|
|
var def = AssemblyDef.Load(new MemoryStream(File.ReadAllBytes(file)));
|
|
|
|
|
|
+ var obsoleteAttribute = new TypeRefUser(def.ManifestModule, "System", "ObsoleteAttribute", def.ManifestModule.CorLibTypes.AssemblyRef);
|
|
|
+ var obsoleteCtor = def.ManifestModule.Import(new MemberRefUser(def.ManifestModule, ".ctor",
|
|
|
+ new MethodSig(CallingConvention.Default, 0, def.ManifestModule.CorLibTypes.Void, new TypeSig[]
|
|
|
+ {
|
|
|
+ def.ManifestModule.CorLibTypes.String
|
|
|
+ }), obsoleteAttribute));
|
|
|
+
|
|
|
foreach(var t in def.ManifestModule.Types)
|
|
|
- ProcessType(t);
|
|
|
+ ProcessType(t, obsoleteCtor);
|
|
|
def.Write(file, new ModuleWriterOptions(def.ManifestModule)
|
|
|
{
|
|
|
StrongNameKey = new StrongNameKey(snk),
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- static void ProcessType(TypeDef type)
|
|
|
+ static void ProcessType(TypeDef type, MemberRef obsoleteCtor)
|
|
|
{
|
|
|
foreach (var nested in type.NestedTypes)
|
|
|
- ProcessType(nested);
|
|
|
+ ProcessType(nested, obsoleteCtor);
|
|
|
if (type.IsInterface)
|
|
|
{
|
|
|
var hideMethods = type.Name.EndsWith("Impl");
|
|
|
var injectMethod = hideMethods
|
|
|
|| type.CustomAttributes.Any(a =>
|
|
|
a.AttributeType.FullName.EndsWith("NotClientImplementableAttribute"));
|
|
|
-
|
|
|
+
|
|
|
if (hideMethods)
|
|
|
{
|
|
|
foreach (var m in type.Methods)
|
|
|
{
|
|
|
- m.Attributes |= MethodAttributes.Public | MethodAttributes.Assembly;
|
|
|
- m.Attributes ^= MethodAttributes.Public;
|
|
|
+ var dflags = MethodAttributes.Public | MethodAttributes.Family | MethodAttributes.FamORAssem |
|
|
|
+ MethodAttributes.FamANDAssem | MethodAttributes.Assembly;
|
|
|
+ m.Attributes = ((m.Attributes | dflags) ^ dflags) | MethodAttributes.Assembly;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -55,8 +63,37 @@ public class RefAssemblyGenerator
|
|
|
| MethodAttributes.NewSlot
|
|
|
| MethodAttributes.HideBySig));
|
|
|
}
|
|
|
+
|
|
|
+ var forceUnstable = type.CustomAttributes.Any(a =>
|
|
|
+ a.AttributeType.FullName.EndsWith("UnstableAttribute"));
|
|
|
+
|
|
|
+ foreach (var m in type.Methods)
|
|
|
+ MarkAsUnstable(m, obsoleteCtor, forceUnstable);
|
|
|
+ foreach (var m in type.Properties)
|
|
|
+ MarkAsUnstable(m, obsoleteCtor, forceUnstable);
|
|
|
+ foreach (var m in type.Events)
|
|
|
+ MarkAsUnstable(m, obsoleteCtor, forceUnstable);
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ static void MarkAsUnstable(IMemberDef def, MemberRef obsoleteCtor, bool force)
|
|
|
+ {
|
|
|
+ if (!force
|
|
|
+ || def.HasCustomAttributes == false
|
|
|
+ || !def.CustomAttributes.Any(a =>
|
|
|
+ a.AttributeType.FullName.EndsWith("UnstableAttribute")))
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (def.CustomAttributes.Any(a => a.TypeFullName.EndsWith("ObsoleteAttribute")))
|
|
|
+ return;
|
|
|
+
|
|
|
+ def.CustomAttributes.Add(new CustomAttribute(obsoleteCtor, new CAArgument[]
|
|
|
+ {
|
|
|
+ new(def.Module.CorLibTypes.String,
|
|
|
+ "This is a part of unstable API and can be changed in minor releases. You have been warned")
|
|
|
+ }));
|
|
|
+ }
|
|
|
|
|
|
public static void GenerateRefAsmsInPackage(string packagePath)
|
|
|
{
|