Json.Net と難読化を結合しようとしたときに発生する問題を克服するために、私のチームと私が発見した解決策を共有したいと思います。
私の設定: VS2013、C#、.NET 4.0、Json.Net 7.0.1、CodeWall/Crypto Obfuscator。
コードを難読化するまで、すべて正常に動作します。その後、json ファイルを逆シリアル化できません (正しくシリアル化されています!)。
Json.Net と難読化を結合しようとしたときに発生する問題を克服するために、私のチームと私が発見した解決策を共有したいと思います。
私の設定: VS2013、C#、.NET 4.0、Json.Net 7.0.1、CodeWall/Crypto Obfuscator。
コードを難読化するまで、すべて正常に動作します。その後、json ファイルを逆シリアル化できません (正しくシリアル化されています!)。
私たちのソリューションは、DefaultSerializationBinder クラスの「ある種のハッキング」を提供します。これは、ソース コードから簡単に選択して自由に変更できます (または、抽象クラス SerializationBinder のカスタム オーバーライドを提供します)。アセンブリ名から正しいアセンブリを検出しようとすると、問題が発生するようです...ここでは、難読化は2つと一致しません。
書き換える必要があるメソッドのコードは次のとおりです。
private static Type GetTypeFromTypeNameKey(TypeNameKey typeNameKey)
{
string assemblyName = typeNameKey.AssemblyName;
string typeName = typeNameKey.TypeName;
if (assemblyName != null)
{
// look, I don't like using obsolete methods as much as you do but this is the only way
// Assembly.Load won't check the GAC for a partial name
Assembly assembly = Assembly.LoadWithPartialName(assemblyName);
if (assembly == null)
{
string partialName = assemblyName;
var elements = assemblyName.Split(',');
if (elements.Length > 0)
{
partialName = elements[0];
}
// will find assemblies loaded with Assembly.LoadFile outside of the main directory
Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly a in loadedAssemblies)
{
if (a.GetName().Name == assemblyName || a.FullName == assemblyName || a.GetName().Name == partialName)
{
assembly = a;
break;
}
}
}
if (assembly == null)
{
throw new JsonSerializationException(string.Format("Could not load assembly '{0}'.", assemblyName));
}
Type type = assembly.GetType(typeName);
if (type == null)
{
throw new JsonSerializationException(string.Format("Could not find type '{0}' in assembly '{1}'.", typeName, assembly.FullName));
}
return type;
}
else if (typeName != null)
{
return Type.GetType(typeName);
}
else
{
return null;
}
}
これが役立つことを願っています!
自由にアイデアを共有してください。他のテストも大歓迎です!