diff --git a/Nustache.Core/Properties/AssemblyInfo.cs b/Nustache.Core/Properties/AssemblyInfo.cs index 657f286..af865db 100644 --- a/Nustache.Core/Properties/AssemblyInfo.cs +++ b/Nustache.Core/Properties/AssemblyInfo.cs @@ -1,6 +1,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information @@ -34,3 +35,5 @@ // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.14.0.0")] [assembly: AssemblyFileVersion("1.14.0.0")] + +[assembly: AllowPartiallyTrustedCallers()] \ No newline at end of file diff --git a/Nustache.Core/ValueGetterFactory.cs b/Nustache.Core/ValueGetterFactory.cs index 0ce4690..130886c 100644 --- a/Nustache.Core/ValueGetterFactory.cs +++ b/Nustache.Core/ValueGetterFactory.cs @@ -45,31 +45,47 @@ protected override void SetItem(int index, ValueGetterFactory item) public ValueGetter GetValueGetter(object target, string name) { - return GetValueGetterOrDefault(Items, target, name) ?? new NoValueGetter(); + return GetValueGetterOrDefault(Items, target, name, target.GetType()) ?? new NoValueGetter(); } public ValueGetter GetCompiledGetter(Type targetType, string name) { - foreach (var factory in Items) + return GetValueGetterOrDefault(Items, null, name, targetType); + } + + private static ValueGetter GetValueGetterOrDefault(IList factories, object target, string name, Type targetType) + { + List factoriesToRemove = null; + foreach (var factory in factories) { - var getter = factory.GetValueGetter(null, targetType, name); - if (getter != null) + try + { + var getter = factory.GetValueGetter(target, targetType, name); + if (getter != null) + { + return getter; + } + } + catch (System.Security.HostProtectionException) { - return getter; + //in the event of a partial trust failure, skip the getter factory and mark it for removal + if (factoriesToRemove == null) + { + factoriesToRemove = new List { factory }; + } + else + { + factoriesToRemove.Add(factory); + } } } - return null; - } - - private static ValueGetter GetValueGetterOrDefault(IEnumerable factories, object target, string name) - { - foreach (var factory in factories) + //remove any getter factories that errored out because of partial trust failure + if (factoriesToRemove != null) { - var getter = factory.GetValueGetter(target, target.GetType(), name); - if (getter != null) + foreach (var factory in factoriesToRemove) { - return getter; + factories.Remove(factory); } }