私のWebアプリでは、c#クラスにjson文字列を解析する逆シリアル化ロジックをテストするためのテストをいくつか作成しました。これらのテストは私のコンピューターでは正常に実行されますが、CI環境では次のエラーメッセージが表示されて失敗します。
Test(s) failed. System.TypeInitializationException : The type initializer for 'Newtonsoft.Json.JsonConvert' threw an exception. ----> System.Security.VerificationException : Operation could destabilize the runtime.
json文字列の例の1つは、これです(テストクラスから):
private const string MatrikkelJson = "{'Gaardsnummer':'9','Bruksnummer':'9','Festenummer':'8','Seksjonsnummer':'8','BlankAllowed':'False','AttrType':'Matrikkel'}";
この文字列は、次のクラスに逆シリアル化する必要があります。
public class MatrikkelDTO : AttributeBaseDTO
{
public string Gaardsnummer { get; set; }
public string Bruksnummer { get; set; }
public string Festenummer { get; set; }
public string Seksjonsnummer { get; set; }
}
public class AttributeBaseDTO
{
public bool BlankAllowed { get; set; }
public string AttrType { get; set; }
}
json文字列を逆シリアル化するメソッドは次のように機能します。最初にbaseobjectを逆シリアル化して、AttrTypeプロパティを取得します。その情報を使用して、json文字列を特定のタイプに逆シリアル化します(AttributBaseDTOから継承するクラスがいくつかあります。
public AttributeValidationHandlerResponse ValidateAttribute(string serializedObject)
{
var response = new AttributeValidationHandlerResponse();
response.Result = false;
//hack... this handler gets called when opening newdocument.aspx. don't know why.
if (serializedObject.Contains("function"))
{
response.Message = "";
return response;
}
if (String.IsNullOrEmpty(serializedObject))
{
response.Message = "attributeobject";
return response;
}
var message = "";
var attributeBase = JsonConvert.DeserializeObject<AttributeBaseDTO>(serializedObject);
if (attributeBase.AttrType == "Matrikkel")
{
var attribute = ConvertJsonStringToAttribute<MatrikkelDTO>(serializedObject);
response = ValidateMatrikkel(attribute);
}
return response;
}
internal T ConvertJsonStringToAttribute<T>(string serializedObject)
{
return JsonConvert.DeserializeObject<T>(serializedObject);
}
しかし、ビルドサーバーではなく自分のマシンで機能する理由がわかりません。VS 2010、asp.net 4.0、netFramework4.0を使用しています。テストフレームワークはnunit2.5.5です
誰か手がかりはありますか?