-Fixed F# serialization partial trust issue
This commit is contained in:
@@ -56,6 +56,7 @@ namespace Newtonsoft.Json.Tests.Utilities
|
||||
Assert.AreEqual("i Phone", StringUtils.ToCamelCase("I Phone"));
|
||||
Assert.AreEqual(" IPhone", StringUtils.ToCamelCase(" IPhone"));
|
||||
Assert.AreEqual("isCIA", StringUtils.ToCamelCase("IsCIA"));
|
||||
Assert.AreEqual("vmQ", StringUtils.ToCamelCase("VmQ"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -88,10 +88,10 @@ namespace Newtonsoft.Json.Utilities
|
||||
|
||||
Type fsharpType = fsharpCoreAssembly.GetType("Microsoft.FSharp.Reflection.FSharpType");
|
||||
|
||||
MethodInfo isUnionMethodInfo = fsharpType.GetMethod("IsUnion", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
|
||||
MethodInfo isUnionMethodInfo = GetMethodWithNonPublicFallback(fsharpType, "IsUnion", BindingFlags.Public | BindingFlags.Static);
|
||||
IsUnion = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall<object>(isUnionMethodInfo);
|
||||
|
||||
MethodInfo getUnionCasesMethodInfo = fsharpType.GetMethod("GetUnionCases", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
|
||||
MethodInfo getUnionCasesMethodInfo = GetMethodWithNonPublicFallback(fsharpType, "GetUnionCases", BindingFlags.Public | BindingFlags.Static);
|
||||
GetUnionCases = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall<object>(getUnionCasesMethodInfo);
|
||||
|
||||
Type fsharpValue = fsharpCoreAssembly.GetType("Microsoft.FSharp.Reflection.FSharpValue");
|
||||
@@ -121,9 +121,25 @@ namespace Newtonsoft.Json.Utilities
|
||||
}
|
||||
}
|
||||
|
||||
private static MethodInfo GetMethodWithNonPublicFallback(Type type, string methodName, BindingFlags bindingFlags)
|
||||
{
|
||||
MethodInfo methodInfo = type.GetMethod(methodName, bindingFlags);
|
||||
|
||||
// if no matching method then attempt to find with nonpublic flag
|
||||
// this is required because in WinApps some methods are private but always using NonPublic breaks medium trust
|
||||
// https://github.com/JamesNK/Newtonsoft.Json/pull/649
|
||||
// https://github.com/JamesNK/Newtonsoft.Json/issues/821
|
||||
if (methodInfo == null && (bindingFlags & BindingFlags.NonPublic) != BindingFlags.NonPublic)
|
||||
{
|
||||
methodInfo = type.GetMethod(methodName, bindingFlags | BindingFlags.NonPublic);
|
||||
}
|
||||
|
||||
return methodInfo;
|
||||
}
|
||||
|
||||
private static MethodCall<object, object> CreateFSharpFuncCall(Type type, string methodName)
|
||||
{
|
||||
MethodInfo innerMethodInfo = type.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
|
||||
MethodInfo innerMethodInfo = GetMethodWithNonPublicFallback(type, methodName, BindingFlags.Public | BindingFlags.Static);
|
||||
MethodInfo invokeFunc = innerMethodInfo.ReturnType.GetMethod("Invoke", BindingFlags.Public | BindingFlags.Instance);
|
||||
|
||||
MethodCall<object, object> call = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall<object>(innerMethodInfo);
|
||||
|
||||
Reference in New Issue
Block a user