繁体   English   中英

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);
    }
}

我看到没有人回复您的帖子,所以我想我会有所想法。 您可能已经知道这些事情,所以提前致歉。

首先,我从混淆代码中看到,从JObject.FromObject返回的对象被JObject.FromObject转换为object类型。 请记住,如果将任何对象引用传递给Console.WriteLine方法,则将调用该对象的默认ToString方法。 因此,在您的示例中将调用Object.ToString()方法。 Object.ToString()MSDN文档中,它指出:

Object.ToString方法的默认实现返回对象类型的标准名称。

我想说的是,您对匿名类型的使用以一种我不知道的方式使事情变得混乱。 但是您可以为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吗?

我希望其他人可以澄清更多。 祝好运!

您/我可以使用动态对象,如下所示:

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文档Pro文档中的GUI了解如何执行此操作。

全面披露:我为PreEmptive Solutions工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM