Skip to content

Commit 41185a3

Browse files
authored
Merge pull request #8 from NetOfficeFw/cleanaddin_task_bugfix
Bugfix: `CleanAddin` task locks the assembly file so the build fails
2 parents 5e8f396 + db9a6a9 commit 41185a3

File tree

3 files changed

+48
-47
lines changed

3 files changed

+48
-47
lines changed

src/AssemblyEx.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System;
2+
using System.IO;
3+
using System.Linq;
24
using System.Reflection;
35

46
namespace NetOffice.Build
@@ -15,5 +17,44 @@ public static string GetCodebase(this string path)
1517
path = path.Replace('\\', '/');
1618
return $"file:///{path}";
1719
}
20+
21+
internal static Assembly ReflectionOnlyLoadAssembly(string path)
22+
{
23+
if (File.Exists(path))
24+
{
25+
var assemblyName = AssemblyName.GetAssemblyName(path);
26+
var assemblies = AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies();
27+
var existing = assemblies.FirstOrDefault(assembly => assembly.FullName == assemblyName.FullName);
28+
if (existing != null)
29+
{
30+
return existing;
31+
}
32+
33+
var content = File.ReadAllBytes(path);
34+
return Assembly.ReflectionOnlyLoad(content);
35+
}
36+
37+
return null;
38+
}
39+
40+
internal static Assembly ReflectionOnlyAssemblyResolve(ResolveEventArgs args, string baseDir)
41+
{
42+
Console.WriteLine($"Assembly: {args?.Name} by {args?.RequestingAssembly?.GetName()}");
43+
44+
var name = new AssemblyName(args.Name);
45+
var path = Path.Combine(baseDir, name.Name + ".dll");
46+
Assembly assembly = null;
47+
if (File.Exists(path))
48+
{
49+
assembly = ReflectionOnlyLoadAssembly(path);
50+
}
51+
else
52+
{
53+
// Log.LogWarning($"Loading assembly by name '{args.Name}'.");
54+
assembly = Assembly.ReflectionOnlyLoad(args.Name);
55+
}
56+
57+
return assembly;
58+
}
1859
}
1960
}

src/CleanAddin.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
using System;
2-
using System.Collections.Generic;
3-
using System.Reflection;
42
using Microsoft.Build.Framework;
53
using Microsoft.Build.Utilities;
64

@@ -17,11 +15,10 @@ public override bool Execute()
1715
{
1816
try
1917
{
20-
var assembly = Assembly.LoadFile(this.AssemblyPath.ItemSpec);
21-
var publicTypes = assembly.GetExportedTypes();
18+
var assemblyPath = this.AssemblyPath.ItemSpec;
2219

23-
var addinTypes = new List<TaskItem>();
24-
var registryWrites = new List<TaskItem>();
20+
var assembly = AssemblyEx.ReflectionOnlyLoadAssembly(assemblyPath);
21+
var publicTypes = assembly.GetExportedTypes();
2522

2623
foreach (var publicType in publicTypes)
2724
{
@@ -51,6 +48,7 @@ public override bool Execute()
5148
foreach (var officeAppItem in this.OfficeApps)
5249
{
5350
var officeApp = officeAppItem.ItemSpec;
51+
Log.LogMessage(MessageImportance.High, $@"Cleaning add-in {progId} from Microsoft Office application {officeApp}");
5452
comClass.DeleteOfficeAddin(officeApp, progId);
5553
}
5654
}

src/RegisterAddin.cs

Lines changed: 3 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ public override bool Execute()
3030
var assemblyPath = this.AssemblyPath.ItemSpec;
3131
var assemblyDir = Path.GetDirectoryName(assemblyPath);
3232

33-
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += (sender, args) => ReflectionOnlyAssemblyResolve(args, assemblyDir);
33+
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += (sender, args) => AssemblyEx.ReflectionOnlyAssemblyResolve(args, assemblyDir);
3434

35-
var assembly = ReflectionOnlyLoadAssembly(assemblyPath);
35+
var assembly = AssemblyEx.ReflectionOnlyLoadAssembly(assemblyPath);
3636
var assemblyName = assembly.GetName();
3737
var assemblyCodebase = assemblyPath.GetCodebase();
3838
var publicTypes = assembly.GetExportedTypes();
@@ -64,7 +64,7 @@ public override bool Execute()
6464
Log.LogMessage(MessageImportance.High, $@"Registering {progId} class with guid {guid.ToRegistryString()}");
6565

6666
var comClass = new ComClassRegistry(this.Log);
67-
67+
6868
var registeredKey = comClass.RegisterProgId(progId, guid);
6969
if (registeredKey != null)
7070
{
@@ -125,43 +125,5 @@ public override bool Execute()
125125

126126
return true;
127127
}
128-
129-
private static Assembly ReflectionOnlyLoadAssembly(string path)
130-
{
131-
if (File.Exists(path))
132-
{
133-
var assemblyName = AssemblyName.GetAssemblyName(path);
134-
var assemblies = AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies();
135-
var existing = assemblies.FirstOrDefault(assembly => assembly.FullName == assemblyName.FullName);
136-
if (existing != null)
137-
{
138-
return existing;
139-
}
140-
141-
var content = File.ReadAllBytes(path);
142-
return Assembly.ReflectionOnlyLoad(content);
143-
}
144-
145-
return null;
146-
}
147-
148-
private Assembly ReflectionOnlyAssemblyResolve(ResolveEventArgs args, string baseDir)
149-
{
150-
Console.WriteLine($"Assembly: {args?.Name} by {args?.RequestingAssembly?.GetName()}");
151-
152-
var name = new AssemblyName(args.Name);
153-
var path = Path.Combine(baseDir, name.Name + ".dll");
154-
Assembly assembly = null;
155-
if (File.Exists(path))
156-
{
157-
assembly = ReflectionOnlyLoadAssembly(path);
158-
}
159-
else
160-
{
161-
assembly = Assembly.ReflectionOnlyLoad(args.Name);
162-
}
163-
164-
return assembly;
165-
}
166128
}
167129
}

0 commit comments

Comments
 (0)