C# - 如何在 Dotfuscator.Net 中使用匿名类型?
C# - How to use anonymous types with Dotfuscator.Net?
我的 C# 应用程序中有这段代码:
JObject personJson = JObject.FromObject(
new
{
name = "John Doe",
age = 34,
height = 1.78,
weight = 79.34
});
Console.WriteLine(person);
它记录:
{
"name": "John Doe",
"age": 34,
"height": 1.78,
"weight": 79.34
}
Dotfuscater 将其混淆为:
Console.WriteLine((object) JObject.FromObject((object) new global::b<string, int, double, double>("John Doe", 34, 1.78, 79.34)));
然后输出是这样的:
{}
如何在 Dotfuscator 中使用匿名 类 而没有这个问题?
编辑:
完整代码:
public static class Example
{
static void LogPerson()
{
JObject personJson = JObject.FromObject(
new
{
name = "John Doe",
age = 34,
height = 1.78,
weight = 79.34
});
Console.WriteLine(JSONObject);
}
}
我看到没有人回复你的post,所以我想我会回应一些想法。这些你可能已经知道了,所以我提前道歉。
首先,我从混淆代码中看到,从 JObject.FromObject
返回的对象被转换为 object
类型。请记住,如果将任何对象引用传递给 Console.WriteLine
方法,将调用该对象的默认 ToString
方法。因此,在您的示例中调用了 Object.ToString()
方法。在 Object.ToString()
的 MSDN 文档中,它指出:
Default implementations of the Object.ToString method return the fully qualified name of the object's type.
我会说你对匿名类型的使用以一种我不知道的方式混淆了事情;但是你能为 JObject
类型写一个自定义的 ToString
扩展方法吗?也许类似于:
public static class Extensions
{
public static string ToJSONString(this JObject jo)
{
// You could step into this method in the VS debugger to
// see what 'jo' looks like. You may have to use reflection
// to get at the properties, but I've never tried it on an
// anonymous type.
}
}
然后你会调用 Console.WriteLine(JSONObject.ToJSONString());
顺便说一句,使用 JSONObject
作为变量名让我很困惑,因为它看起来像 Type
;可以改用 jsonObject
吗?
我希望其他人可以澄清一些事情。祝你好运!
You/I 可以使用动态对象,像这样:
dynamic person = new ExpandoObject();
person.name = "John Doe";
person.age = 34;
person.height = 1.78;
person.weight = 79.34;
JObject personJson = JObject.FromObject(person);
Console.WriteLine(personJson);
混淆后看起来很奇怪,但确实有效。输出完全符合预期。
Dotfuscator 似乎正在删除属性,即使您不希望这样做。 (它这样做是因为它通常是无害的,并且它使逆向工程变得更加困难。)您应该能够通过配置匹配 CompilerGeneratedAttribute
的排除规则来排除这些属性重命名,这将防止它们被删除.这将防止删除匿名 类 上的所有此类属性。
下面是一个项目文件(片段)的示例,它可以执行此操作:
<excludelist>
<type name=".*" regex="true" excludetype="false">
<customattribute name=".*CompilerGeneratedAttribute" regex="true" />
<propertymember name=".*" regex="true" />
</type>
</excludelist>
您可以在 Community Edition docs or Pro docs 中阅读有关如何通过 GUI 执行此操作的信息。
完全披露:我为 PreEmptive Solutions 工作。
我的 C# 应用程序中有这段代码:
JObject personJson = JObject.FromObject(
new
{
name = "John Doe",
age = 34,
height = 1.78,
weight = 79.34
});
Console.WriteLine(person);
它记录:
{
"name": "John Doe",
"age": 34,
"height": 1.78,
"weight": 79.34
}
Dotfuscater 将其混淆为:
Console.WriteLine((object) JObject.FromObject((object) new global::b<string, int, double, double>("John Doe", 34, 1.78, 79.34)));
然后输出是这样的:
{}
如何在 Dotfuscator 中使用匿名 类 而没有这个问题?
编辑:
完整代码:
public static class Example
{
static void LogPerson()
{
JObject personJson = JObject.FromObject(
new
{
name = "John Doe",
age = 34,
height = 1.78,
weight = 79.34
});
Console.WriteLine(JSONObject);
}
}
我看到没有人回复你的post,所以我想我会回应一些想法。这些你可能已经知道了,所以我提前道歉。
首先,我从混淆代码中看到,从 JObject.FromObject
返回的对象被转换为 object
类型。请记住,如果将任何对象引用传递给 Console.WriteLine
方法,将调用该对象的默认 ToString
方法。因此,在您的示例中调用了 Object.ToString()
方法。在 Object.ToString()
的 MSDN 文档中,它指出:
Default implementations of the Object.ToString method return the fully qualified name of the object's type.
我会说你对匿名类型的使用以一种我不知道的方式混淆了事情;但是你能为 JObject
类型写一个自定义的 ToString
扩展方法吗?也许类似于:
public static class Extensions
{
public static string ToJSONString(this JObject jo)
{
// You could step into this method in the VS debugger to
// see what 'jo' looks like. You may have to use reflection
// to get at the properties, but I've never tried it on an
// anonymous type.
}
}
然后你会调用 Console.WriteLine(JSONObject.ToJSONString());
顺便说一句,使用 JSONObject
作为变量名让我很困惑,因为它看起来像 Type
;可以改用 jsonObject
吗?
我希望其他人可以澄清一些事情。祝你好运!
You/I 可以使用动态对象,像这样:
dynamic person = new ExpandoObject();
person.name = "John Doe";
person.age = 34;
person.height = 1.78;
person.weight = 79.34;
JObject personJson = JObject.FromObject(person);
Console.WriteLine(personJson);
混淆后看起来很奇怪,但确实有效。输出完全符合预期。
Dotfuscator 似乎正在删除属性,即使您不希望这样做。 (它这样做是因为它通常是无害的,并且它使逆向工程变得更加困难。)您应该能够通过配置匹配 CompilerGeneratedAttribute
的排除规则来排除这些属性重命名,这将防止它们被删除.这将防止删除匿名 类 上的所有此类属性。
下面是一个项目文件(片段)的示例,它可以执行此操作:
<excludelist>
<type name=".*" regex="true" excludetype="false">
<customattribute name=".*CompilerGeneratedAttribute" regex="true" />
<propertymember name=".*" regex="true" />
</type>
</excludelist>
您可以在 Community Edition docs or Pro docs 中阅读有关如何通过 GUI 执行此操作的信息。
完全披露:我为 PreEmptive Solutions 工作。