Skip to content

Commit 36ba930

Browse files
committed
1.0.6
fix reference problem
1 parent 497c6e1 commit 36ba930

6 files changed

Lines changed: 115 additions & 9 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Injects method cache code.
77
### This is an add-in for [Fody](https://github.com/Fody/Fody/)
88
[Introduction to Fody](http://github.com/Fody/Fody/wiki/SampleUsage)
99

10-
This project was forked by [MethodTimer](https://github.com/Fody/MethodTimer) original.
10+
This project was forked by [MethodCache](https://github.com/Dresel/MethodCache) original.
1111
And updated to support DotNet Core.
1212

1313
## Milestone

src/Cache.Fody/AssemblyResolver.cs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using Mono.Cecil;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.IO;
5+
using System.Linq;
6+
using System.Text;
7+
using System.Threading.Tasks;
8+
9+
namespace Cache.Fody
10+
{
11+
public class AssemblyResolver : IAssemblyResolver
12+
{
13+
Dictionary<string, string> referenceDictionary;
14+
List<string> splitReferences;
15+
Dictionary<string, AssemblyDefinition> assemblyDefinitionCache = new Dictionary<string, AssemblyDefinition>(StringComparer.InvariantCultureIgnoreCase);
16+
17+
public AssemblyResolver()
18+
{
19+
}
20+
21+
public AssemblyResolver(List<string> splitReferences)
22+
{
23+
referenceDictionary = new Dictionary<string, string>();
24+
this.splitReferences = splitReferences;
25+
26+
foreach (var filePath in splitReferences)
27+
{
28+
referenceDictionary[Path.GetFileNameWithoutExtension(filePath)] = filePath;
29+
}
30+
}
31+
32+
AssemblyDefinition GetAssembly(string file, ReaderParameters parameters)
33+
{
34+
if (assemblyDefinitionCache.TryGetValue(file, out var assembly))
35+
{
36+
return assembly;
37+
}
38+
if (parameters.AssemblyResolver == null)
39+
{
40+
parameters.AssemblyResolver = this;
41+
}
42+
try
43+
{
44+
return assemblyDefinitionCache[file] = AssemblyDefinition.ReadAssembly(file, parameters);
45+
}
46+
catch (Exception exception)
47+
{
48+
throw new Exception($"Could not read '{file}'.", exception);
49+
}
50+
}
51+
52+
public AssemblyDefinition Resolve(string assemblyName)
53+
{
54+
return Resolve(new AssemblyNameReference(assemblyName, null));
55+
}
56+
57+
public AssemblyDefinition Resolve(AssemblyNameReference assemblyNameReference)
58+
{
59+
return Resolve(assemblyNameReference, new ReaderParameters());
60+
}
61+
62+
public AssemblyDefinition Resolve(AssemblyNameReference assemblyNameReference, ReaderParameters parameters)
63+
{
64+
if (parameters == null)
65+
{
66+
parameters = new ReaderParameters();
67+
}
68+
69+
if (referenceDictionary.TryGetValue(assemblyNameReference.Name, out var fileFromDerivedReferences))
70+
{
71+
return GetAssembly(fileFromDerivedReferences, parameters);
72+
}
73+
74+
var joinedReferences = string.Join(Environment.NewLine, splitReferences.OrderBy(x => x));
75+
return null;
76+
}
77+
78+
public virtual void Dispose()
79+
{
80+
foreach (var value in assemblyDefinitionCache.Values)
81+
{
82+
value?.Dispose();
83+
}
84+
}
85+
86+
}
87+
}

src/Cache.Fody/ModuleWeaver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Mono.Cecil.Rocks;
55
using Mono.Cecil.Cil;
66
using Fody;
7+
using System;
78

89
namespace Cache.Fody
910
{
@@ -48,6 +49,5 @@ public override IEnumerable<string> GetAssembliesForScanning()
4849
yield return "System.Core";
4950
yield return "netstandard";
5051
}
51-
5252
}
5353
}

src/Cache.Fody/ReferenceFinder.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
using global::Fody;
44
using Mono.Cecil;
55
using Mono.Cecil.Rocks;
6+
using System;
67
using System.Collections.Generic;
8+
using System.IO;
79
using System.Linq;
10+
using System.Reflection;
811

912
public static class ReferenceFinder
1013
{
11-
//private static IAssemblyResolver AssemblyResolver { get; set; }
14+
private static AssemblyResolver AssemblyResolver { get; set; }
1215

1316
//private static TypeDefinition CompilerGeneratedAttribute { get; set; }
1417

@@ -36,7 +39,18 @@ public static void LoadReferences(BaseModuleWeaver weaver)
3639
DictionaryConstructor = weaver.FindType("Dictionary`2").Resolve().GetConstructors().FirstOrDefault();
3740
DictionaryAddMethod = weaver.FindType("Dictionary`2").Method("Add");
3841
SystemTypeGetTypeFromHandleMethod = weaver.FindType("Type").Method("GetTypeFromHandle");
39-
CacheAssembly = new DefaultAssemblyResolver().Resolve(weaver.ModuleDefinition.AssemblyReferences.FirstOrDefault(r => r.Name == "Cache"));
42+
43+
//load Cache reference
44+
var references = SplitUpReferences(weaver);
45+
AssemblyResolver = new AssemblyResolver(references);
46+
CacheAssembly = AssemblyResolver.Resolve("Cache");
47+
}
48+
49+
private static List<string> SplitUpReferences(BaseModuleWeaver weaver)
50+
{
51+
return weaver.References
52+
.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
53+
.ToList();
4054
}
4155

4256
}

src/Cache.Fody/WeaveHelper.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.IO;
34
using System.Linq;
45
using System.Text;
56
using System.Text.RegularExpressions;
@@ -443,6 +444,11 @@ public static void WeaveMethod(BaseModuleWeaver weaver, MethodDefinition methodD
443444
propertyGet = propertyInject.GetMethod;
444445
}
445446

447+
if (propertyInject == null )
448+
{
449+
propertyInject = methodDefinition.DeclaringType.Properties.FirstOrDefault(p => p.Name == "Cache");
450+
}
451+
446452
//weave mthod
447453
methodDefinition.Body.InitLocals = true;
448454

@@ -490,7 +496,6 @@ public static void WeaveMethod(BaseModuleWeaver weaver, MethodDefinition methodD
490496
current = current.Append(processor.Create(OpCodes.Call, methodDefinition.Module.ImportReference(refSetter)), processor);
491497
}
492498

493-
494499
current = InjectCacheKeyCreatedCode(weaver, methodDefinition, current, processor, cacheKeyIndex);
495500

496501
TypeDefinition propertyGetReturnTypeDefinition = propertyGet.ReturnType.Resolve();

src/Cache/Cache.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22

33
<PropertyGroup>
44
<TargetFrameworks>net46;netstandard2.0</TargetFrameworks>
5-
<PackageVersion>1.0.4</PackageVersion>
5+
<PackageVersion>1.0.6</PackageVersion>
66
<Description>Injects method cache code.</Description>
77
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
88
<PackageProjectUrl>https://github.com/KevinYeti/Cache</PackageProjectUrl>
99
<PackageIconUrl>https://raw.githubusercontent.com/KevinYeti/Cache/master/icon.png</PackageIconUrl>
1010
<PackageTags>Cache, ILWeaving, Fody, Cecil, AOP</PackageTags>
1111
<PackageLicenseUrl>https://github.com/KevinYeti/Cache/blob/master/LICENSE</PackageLicenseUrl>
1212
<PackageId>Cache.Fody</PackageId>
13-
<AssemblyVersion>1.0.4.0</AssemblyVersion>
14-
<FileVersion>1.0.4.0</FileVersion>
15-
<Version>1.0.4</Version>
13+
<AssemblyVersion>1.0.6.0</AssemblyVersion>
14+
<FileVersion>1.0.6.0</FileVersion>
15+
<Version>1.0.6</Version>
1616
</PropertyGroup>
1717

1818
<ItemGroup>

0 commit comments

Comments
 (0)