【问题标题】:Crash in C# Class Library when i use it使用 C# 类库时崩溃
【发布时间】:2019-01-04 15:06:42
【问题描述】:

来源/目的地类型

public struct MyStruct
{
    public int FirstText { get; set; }
    public int SecondText { get; set; }
}

源/目标 JSON

{FirstText:1,SecondText:2}

预期行为

当我在单个 exe 演示中使用它时: 1 - 2

实际行为

当我在 C# 类库中使用它时,它会崩溃:

System.Reflection.TargetInvocationException: Exception has been thrown by the ta
rget of an invocation. ---> System.Security.SecurityException: Request failed.
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOn
ly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Bo
olean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipChec
kThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean s
kipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Activator.CreateInstance(Type type)
   at Newtonsoft.Json.Utilities.LateBoundReflectionDelegateFactory.<>c__DisplayC
lass9`1.<CreateDefaultConstructor>b__7()
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewObject
(JsonReader reader, JsonObjectContract objectContract, JsonProperty containerMem
ber, JsonProperty containerProperty, String id, Boolean& createdFromNonDefaultCr
eator)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(Js
onReader reader, Type objectType, JsonContract contract, JsonProperty member, Js
onContainerContract containerContract, JsonProperty containerMember, Object exis
tingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInte
rnal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty mem
ber, JsonContainerContract containerContract, JsonProperty containerMember, Obje
ct existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(Jso
nReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type
 objectType)
   at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, Jso
nSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSeriali
zerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)

复制步骤

var test = Newtonsoft.Json.JsonConvert.DeserializeObject<MyStruct>("{FirstText:1,SecondText:2}");

System.Console.WriteLine("{0} - {1}", test.FirstText, test.SecondText);

当我在单个 exe 演示中使用 Json.NET 时,它运行良好。 但是当我把它放在 C# 类库中时,它就不起作用了。 我在 github 上推送了一个问题,但我仍然在那里问,因为我太紧张了等不及了......

【问题讨论】:

  • 函数&结构&类都是Public的。
  • 调用Newtonsoft.Json.JsonConvert.DeserializeObject的函数设置为[PermissionSet(SecurityAction.Assert, Unrestricted = true)]。
  • 也许您需要添加更多信息。我刚刚建立了一个我理解你正在尝试的最小示例,它工作得很好。你能发布你的解决方案的结构吗?
  • 首先我使用 C++ ExecuteInDefaultAppDomain 来执行 Sandbox.Bootstrap(一个 C# 类库),然后调用 AppDomain.Load 来加载程序集并调用 MethodBase.Invoke 来触发新库的函数。最后我使用Newtonsoft.Json.JsonConvert.DeserializeObject 并获取异常...
  • 这似乎是非常相关的信息,因为您正在处理SecurityException。不幸的是,我在这方面的专业知识为零,因此无法从这里开始提供帮助。

标签: c# exception json.net securityexception targetinvocationexception


【解决方案1】:

您提供的 JSON 似乎无效。 键必须用引号括起来。试试这个: { "FirstText": 1, "SecondText": 2 }

编辑:如果您打算在源代码中对 JSON 进行硬编码,请确保将其转义以便正确解释。

【讨论】:

  • 我写了一个 JSON 文件:{ "123": { "FirstText": 1, "SecondText": 2 } }
  • 我的新代码是:JToken值; if (JObject.Parse(Encoding.Default.GetString(Properties.Resources.MyTest)).TryGetValue("123", out value)) { System.Console.WriteLine(value.ToString()); var obj = JsonConvert.DeserializeObject(value.ToString()); System.Console.WriteLine("{0} - {1}", obj.FirstText, obj.SecondText); }
  • 输出为:{ "FirstText": 1, "SecondText": 2 } System.Security.SecurityException: 请求失败。在 System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型,Boolean publicOnly,Boolean noCheck,Boolean& canBeCached,RuntimeMethodHandleInternal& ctor,Bo olean& bNeedSecurityCheck)在 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean skipCheckThis,Boolean fillCache,StackCrawlMark& stackMark)在系统。 RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean s kipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
  • 在 System.Activator.CreateInstance(Type type, Boolean nonPublic) at System.Activator.CreateInstance(Type type) at Newtonsoft.Json.Utilities.LateBoundReflectionDelegateFactory.c__DisplayC lass9`1. b__7() 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewObject(JsonReader 阅读器、JsonObjectContract objectContract、JsonProperty containerMember、JsonProperty containerProperty、String id、Boolean& createdFromNonDefaultCreator)
  • 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(Js onReader reader, Type objectType, JsonContract contract, JsonProperty member, Js onContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization。 JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
【解决方案2】:

沙盒化 AppDomain 需要完全信任引用,它可以通过两种方式给出: 1. GAC 注册程序集。 2. 使用AppDomain.CreateDomain时设置程序集为fullTrustAssemblies with StrongName。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多