Skip to content

Commit bbd102b

Browse files
committed
[Xamarin.Android.Build.Tasks] make sure Disposable () is called for assembly
see jbevain/cecil#291 this fixes one of the `Sharing violation` issues, probably also #44529
1 parent 7f9a114 commit bbd102b

File tree

2 files changed

+40
-39
lines changed

2 files changed

+40
-39
lines changed

src/Xamarin.Android.Build.Tasks/Tasks/RemoveRegisterAttribute.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ public override bool Execute ()
2424

2525
// Find Mono.Android.dll
2626
var mono_android = ShrunkFrameworkAssemblies.First (f => Path.GetFileNameWithoutExtension (f.ItemSpec) == "Mono.Android").ItemSpec;
27-
var assembly = AssemblyDefinition.ReadAssembly (mono_android);
27+
using (var assembly = AssemblyDefinition.ReadAssembly (mono_android, new ReaderParameters { ReadWrite = true })) {
28+
// Strip out [Register] attributes
29+
foreach (TypeDefinition type in assembly.MainModule.Types)
30+
ProcessType (type);
2831

29-
// Strip out [Register] attributes
30-
foreach (TypeDefinition type in assembly.MainModule.Types)
31-
ProcessType (type);
32-
33-
assembly.Write (mono_android);
32+
assembly.Write (mono_android);
33+
}
3434

3535
return true;
3636
}

src/Xamarin.Android.Build.Tasks/Tasks/StripEmbeddedLibraries.cs

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -42,42 +42,43 @@ public override bool Execute ()
4242
if (MonoAndroidHelper.IsFrameworkAssembly (fileName) && !MonoAndroidHelper.FrameworkEmbeddedJarLookupTargets.Contains (Path.GetFileName (fileName)))
4343
continue;
4444

45-
var assembly = res.GetAssembly (assemblyPath);
46-
bool assembly_modified = false;
47-
foreach (var mod in assembly.Modules) {
48-
// embedded jars
49-
var resjars = mod.Resources.Where (r => r.Name.EndsWith (".jar", StringComparison.InvariantCultureIgnoreCase)).Select (r => (EmbeddedResource) r);
50-
foreach (var resjar in resjars.ToArray ()) {
51-
Log.LogDebugMessage (" Stripped {0}", resjar.Name);
52-
mod.Resources.Remove (resjar);
53-
assembly_modified = true;
45+
using (var assembly = res.GetAssembly (assemblyPath, new ReaderParameters { ReadWrite = true })) {
46+
bool assembly_modified = false;
47+
foreach (var mod in assembly.Modules) {
48+
// embedded jars
49+
var resjars = mod.Resources.Where (r => r.Name.EndsWith (".jar", StringComparison.InvariantCultureIgnoreCase)).Select (r => (EmbeddedResource) r);
50+
foreach (var resjar in resjars.ToArray ()) {
51+
Log.LogDebugMessage (" Stripped {0}", resjar.Name);
52+
mod.Resources.Remove (resjar);
53+
assembly_modified = true;
54+
}
55+
// embedded AndroidNativeLibrary archive
56+
var nativezip = mod.Resources.FirstOrDefault (r => r.Name == "__AndroidNativeLibraries__.zip") as EmbeddedResource;
57+
if (nativezip != null) {
58+
Log.LogDebugMessage (" Stripped {0}", nativezip.Name);
59+
mod.Resources.Remove (nativezip);
60+
assembly_modified = true;
61+
}
62+
// embedded AndroidResourceLibrary archive
63+
var reszip = mod.Resources.FirstOrDefault (r => r.Name == "__AndroidLibraryProjects__.zip") as EmbeddedResource;
64+
if (reszip != null) {
65+
Log.LogDebugMessage (" Stripped {0}", reszip.Name);
66+
mod.Resources.Remove (reszip);
67+
assembly_modified = true;
68+
}
5469
}
55-
// embedded AndroidNativeLibrary archive
56-
var nativezip = mod.Resources.FirstOrDefault (r => r.Name == "__AndroidNativeLibraries__.zip") as EmbeddedResource;
57-
if (nativezip != null) {
58-
Log.LogDebugMessage (" Stripped {0}", nativezip.Name);
59-
mod.Resources.Remove (nativezip);
60-
assembly_modified = true;
61-
}
62-
// embedded AndroidResourceLibrary archive
63-
var reszip = mod.Resources.FirstOrDefault (r => r.Name == "__AndroidLibraryProjects__.zip") as EmbeddedResource;
64-
if (reszip != null) {
65-
Log.LogDebugMessage (" Stripped {0}", reszip.Name);
66-
mod.Resources.Remove (reszip);
67-
assembly_modified = true;
68-
}
69-
}
70-
if (assembly_modified) {
71-
Log.LogDebugMessage (" The stripped library is saved as {0}", assemblyPath);
70+
if (assembly_modified) {
71+
Log.LogDebugMessage (" The stripped library is saved as {0}", assemblyPath);
7272

73-
// Output assembly needs to regenerate symbol file even if no IL/metadata was touched
74-
// because Cecil still rewrites all assembly types in Cecil order (type A, nested types of A, type B, etc)
75-
// and not in the original order causing symbols if original order doesn't match Cecil order
76-
var wp = new WriterParameters () {
77-
WriteSymbols = assembly.MainModule.HasSymbols
78-
};
73+
// Output assembly needs to regenerate symbol file even if no IL/metadata was touched
74+
// because Cecil still rewrites all assembly types in Cecil order (type A, nested types of A, type B, etc)
75+
// and not in the original order causing symbols if original order doesn't match Cecil order
76+
var wp = new WriterParameters () {
77+
WriteSymbols = assembly.MainModule.HasSymbols
78+
};
7979

80-
assembly.Write (assemblyPath, wp);
80+
assembly.Write (assemblyPath, wp);
81+
}
8182
}
8283
}
8384
return true;

0 commit comments

Comments
 (0)