summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Build.Tasks
diff options
context:
space:
mode:
authorStephane Delcroix <stephane@delcroix.org>2017-03-16 20:09:22 +0100
committerSamantha Houts <samantha@teamredwall.com>2017-03-16 12:09:22 -0700
commit467c1befa1379c2644a3607d87db9a6178575306 (patch)
treedd5153c7d38ca310177f56a24587ad69d56f0498 /Xamarin.Forms.Build.Tasks
parenteb8b4d19450e3264fdd20e964f48facca6521070 (diff)
downloadxamarin-forms-467c1befa1379c2644a3607d87db9a6178575306.tar.gz
xamarin-forms-467c1befa1379c2644a3607d87db9a6178575306.tar.bz2
xamarin-forms-467c1befa1379c2644a3607d87db9a6178575306.zip
Resource loading (#815)
* Resource Loader * Replace XamlLoader API by ResourceLoader for the Previewer * instruct generated IL to use the resourceLoader * [docs] update docs * oops * [docs] fix docs
Diffstat (limited to 'Xamarin.Forms.Build.Tasks')
-rw-r--r--Xamarin.Forms.Build.Tasks/XamlCTask.cs52
1 files changed, 34 insertions, 18 deletions
diff --git a/Xamarin.Forms.Build.Tasks/XamlCTask.cs b/Xamarin.Forms.Build.Tasks/XamlCTask.cs
index c41ddd97..8bbb0b26 100644
--- a/Xamarin.Forms.Build.Tasks/XamlCTask.cs
+++ b/Xamarin.Forms.Build.Tasks/XamlCTask.cs
@@ -176,7 +176,7 @@ namespace Xamarin.Forms.Build.Tasks
Logger.LogString(2, " Replacing {0}.InitializeComponent ()... ", typeDef.Name);
Exception e;
- if (!TryCoreCompile(initComp, initCompRuntime, rootnode, out e)) {
+ if (!TryCoreCompile(initComp, initCompRuntime, rootnode, resource.Name, out e)) {
success = false;
Logger.LogLine(2, "failed.");
(thrownExceptions = thrownExceptions ?? new List<Exception>()).Add(e);
@@ -195,6 +195,8 @@ namespace Xamarin.Forms.Build.Tasks
Logger.LogLine(2, "done");
}
+ Logger.LogLine(2, "");
+
if (outputGeneratedILAsCode)
Logger.LogLine(2, " Decompiling option has been removed. Use a 3rd party decompiler to admire the beauty of the IL generated");
@@ -238,45 +240,59 @@ namespace Xamarin.Forms.Build.Tasks
return success;
}
- bool TryCoreCompile(MethodDefinition initComp, MethodDefinition initCompRuntime, ILRootNode rootnode, out Exception exception)
+ bool TryCoreCompile(MethodDefinition initComp, MethodDefinition initCompRuntime, ILRootNode rootnode, string resourceId, out Exception exception)
{
try {
var body = new MethodBody(initComp);
+ var module = body.Method.Module;
var il = body.GetILProcessor();
il.Emit(OpCodes.Nop);
if (initCompRuntime != null) {
// Generating branching code for the Previewer
- // IL_0007: call class [mscorlib]System.Func`2<class [mscorlib]System.Type,string> class [Xamarin.Forms.Xaml.Internals]Xamarin.Forms.Xaml.XamlLoader::get_XamlFileProvider()
- // IL_000c: brfalse IL_0031
- // IL_0011: call class [mscorlib]System.Func`2<class [mscorlib]System.Type,string> class [Xamarin.Forms.Xaml.Internals]Xamarin.Forms.Xaml.XamlLoader::get_XamlFileProvider()
- // IL_0016: ldarg.0
- // IL_0017: call instance class [mscorlib]System.Type object::GetType()
- // IL_001c: callvirt instance !1 class [mscorlib]System.Func`2<class [mscorlib]System.Type, string>::Invoke(!0)
- // IL_0021: brfalse IL_0031
- // IL_0026: ldarg.0
- // IL_0027: call instance void class Xamarin.Forms.Xaml.UnitTests.XamlLoaderGetXamlForTypeTests::__InitComponentRuntime()
- // IL_002c: ret
- // IL_0031: nop
+ //First using the ResourceLoader
var nop = Instruction.Create(OpCodes.Nop);
+ var getResourceProvider = module.ImportReference(module.ImportReference(typeof(Internals.ResourceLoader))
+ .Resolve()
+ .Properties.FirstOrDefault(pd => pd.Name == "ResourceProvider")
+ .GetMethod);
+ il.Emit(OpCodes.Call, getResourceProvider);
+ il.Emit(OpCodes.Brfalse, nop);
+ il.Emit(OpCodes.Call, getResourceProvider);
+ il.Emit(OpCodes.Ldstr, resourceId);
+ var func = module.ImportReference(module.ImportReference(typeof(Func<string, string>))
+ .Resolve()
+ .Methods.FirstOrDefault(md => md.Name == "Invoke"));
+ func = func.ResolveGenericParameters(module.ImportReference(typeof(Func<string, string>)), module);
+ il.Emit(OpCodes.Callvirt, func);
+ il.Emit(OpCodes.Brfalse, nop);
+ il.Emit(OpCodes.Ldarg_0);
+ il.Emit(OpCodes.Call, initCompRuntime);
+ il.Emit(OpCodes.Ret);
+ il.Append(nop);
- var getXamlFileProvider = body.Method.Module.ImportReference(body.Method.Module.ImportReference(typeof(Xamarin.Forms.Xaml.Internals.XamlLoader))
+ //Or using the deprecated XamlLoader
+ nop = Instruction.Create(OpCodes.Nop);
+#pragma warning disable 0618
+ var getXamlFileProvider = module.ImportReference(module.ImportReference(typeof(Xaml.Internals.XamlLoader))
.Resolve()
.Properties.FirstOrDefault(pd => pd.Name == "XamlFileProvider")
.GetMethod);
+#pragma warning restore 0618
+
il.Emit(OpCodes.Call, getXamlFileProvider);
il.Emit(OpCodes.Brfalse, nop);
il.Emit(OpCodes.Call, getXamlFileProvider);
il.Emit(OpCodes.Ldarg_0);
- var getType = body.Method.Module.ImportReference(body.Method.Module.ImportReference(typeof(object))
+ var getType = module.ImportReference(module.ImportReference(typeof(object))
.Resolve()
.Methods.FirstOrDefault(md => md.Name == "GetType"));
il.Emit(OpCodes.Call, getType);
- var func = body.Method.Module.ImportReference(body.Method.Module.ImportReference(typeof(Func<Type, string>))
+ func = module.ImportReference(module.ImportReference(typeof(Func<Type, string>))
.Resolve()
.Methods.FirstOrDefault(md => md.Name == "Invoke"));
- func = func.ResolveGenericParameters(body.Method.Module.ImportReference(typeof(Func<Type, string>)), body.Method.Module);
+ func = func.ResolveGenericParameters(module.ImportReference(typeof(Func<Type, string>)), module);
il.Emit(OpCodes.Callvirt, func);
il.Emit(OpCodes.Brfalse, nop);
il.Emit(OpCodes.Ldarg_0);
@@ -285,7 +301,7 @@ namespace Xamarin.Forms.Build.Tasks
il.Append(nop);
}
- var visitorContext = new ILContext(il, body, body.Method.Module);
+ var visitorContext = new ILContext(il, body, module);
rootnode.Accept(new XamlNodeVisitor((node, parent) => node.Parent = parent), null);
rootnode.Accept(new ExpandMarkupsVisitor(visitorContext), null);