Programing

'System.Web.Helpers.Json..cctor ()'메서드가 'System.Web.Helpers.Json.CreateSerializer ()'메서드에 액세스하려는 시도가 실패했습니다.

lottogame 2020. 11. 20. 08:22
반응형

'System.Web.Helpers.Json..cctor ()'메서드가 'System.Web.Helpers.Json.CreateSerializer ()'메서드에 액세스하려는 시도가 실패했습니다.


NET 4에서 System.Web.Helpers.Json일부 JSON을 deserialize 하는 사용 하고 있습니다 dynamic. 다음 줄은이 오류로 실패합니다.TypeInitializationException: Attempt by method 'System.Web.Helpers.Json..cctor()' to access method 'System.Web.Helpers.Json.CreateSerializer()' failed.

var json = Json.Decode(response);

response긴하지만 유효 JSON이다. 여기서 문제가 무엇일까요? 짧은 손수 JSON으로 LINQPad를 사용해 보았고 작동했습니다. 이것은 일종의 구성 문제입니까?

[편집하다]

다음은 실제 샘플 JSON입니다. 내용이 거의 관련이없는 것 같습니다. 새로운 콘솔 응용 프로그램 또는 LINQPad에서 실행되면 예상대로 작동합니다. 그러나 새로운 Windows Forms 응용 프로그램에서 동일한 코드를 실행하려고하면 위의 오류가 표시됩니다.

var json = Json.Decode("{\"r\":{\"0\":{\"id\":\"2\"},\"1\":{\"id\":\"33\"}}}");

[편집 2]

실제로 이것은 프로젝트 유형과 관련이 없음이 밝혀졌습니다. 프로젝트가 디버깅되는 경우 예외가 발생합니다. 단순히 실행하면 예외가 발생하지 않습니다. 이상하지?


나는이 질문을 잊고 그 동안 내 대답을 찾았습니다. Microsoft의 Connect 사이트 어딘가에 있다고 생각하지만 확실하지 않습니다. 이제 공유합시다.

기본적으로이 문제를 해결하려면 디버그 아래의 프로젝트 설정에서 "Visual Studio 호스팅 프로세스 사용"이 선택 취소 되어 있는지 확인해야합니다 . 왜 이런 일이 발생하는지 잘 모르겠지만 이것은 확실히 "고정"하는 방법입니다. 나는 이것에 대해 알게되자 답변 검색을 중단했습니다. 나에게는 충분했습니다.

설정 / 디버그


부분 신뢰에서 실행중인 경우에도 발생할 수 있습니다. 가능한 이유는 여기 에서 예외 설명을 확인하십시오 .

웹 컨텍스트에서 실행되지 않기 때문에 이것이 적용되는지 모르겠지만 링크가 설명하는 내용은 다음과 같습니다.

이 예외는 다음과 같은 상황에서 발생합니다.

  • 리플렉션을 사용하여 부분적으로 신뢰할 수있는 코드에서 일반 컴파일 된 코드에서 액세스 할 수없는 개인, 보호 또는 내부 메서드에 액세스합니다.

  • 투명 코드에서 보안에 중요한 방법에 액세스합니다.

  • 클래스 라이브러리에있는 메서드의 액세스 수준이 변경되었으며 라이브러리를 참조하는 하나 이상의 어셈블리가 다시 컴파일되지 않았습니다.


붙박이 json 클래스에 문제가 있습니다.

다른 방법으로이를 수행하려면 아래 코드를 사용하십시오.

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new DynamicJavaScriptConverter[] { new DynamicJavaScriptConverter() });
var result = WrapObject(serializer.DeserializeObject(value)); // here you will have result.

private object WrapObject(object value)
    {
        IDictionary<string, object> values = value as IDictionary<string, object>;
        if (values != null)
        {
            return new DynamicJsonObject(values);
        }
        object[] arrayValues = value as object[];
        if (arrayValues != null)
        {
            return new DynamicJsonArray(arrayValues);
        }
        return value;
    }

Roland의 답변에 더하여 나열된 일부 어셈블리 불일치는 AssemblyInfo.cs 파일에서 수정할 수 있습니다.

내 AssemblyInfo의 문제가되는 줄은 다음과 같습니다.

[assembly: AllowPartiallyTrustedCallers]

이를 제거하면이 어셈블리를 동적으로로드 한 다른 어셈블리에서 설정하려고했던 공용 클래스의 공용 속성에 액세스 할 수있었습니다.

참고 URL : https://stackoverflow.com/questions/7066726/attempt-by-method-system-web-helpers-json-cctor-to-access-method-system-we

반응형