Компилятор создал анонимные типы: разрушаемое поведение

У меня есть код HTTP RESTfull на стороне клиента, который зависит от удобства, которое обеспечивают анонимные типы, созданные компилятором .net.

пример анонимного типа0:

string prop_1 = "strValue1"; int prop_2 = 5; new { prop1 = prop_1, prop2 = prop_2};

пример анонимного типа1:

new { prop1 = "strValue1", prop2 = 5};

пример анонимного типа2 (также допустимый):

string prop1 = "strValue1"; int prop2 = 5; new { prop1, prop2};

Проблема здесь в том, что имена сгенерированных компилятором свойств анонимных типов очень часто важны и не могут быть переименованы. В частности, если пользователь активно объявил имя свойства для анонимного типа, это может указывать на то, что имя действительно важно — даже вне сборки —

Сообщество Dotfuscator в настоящее время по умолчанию переименовывает свойства анонимных типов.

Одной из таких проблемных областей является «специальное» создание объектов JSON для сериализации и передачи по сети. См. код ниже.

Это некоторый код, в котором я вручную собираю содержимое HTTP-сообщения для запроса WebAPI. Корректность запроса зависит от точного имени свойства. Анонимный тип используется, чтобы не объявлять новые новые типы для использования для каждого типа HTTP-запроса WebAPI. Имена username, password и request_token важны вне приложения (для сервера API)

string baseUrl = BASE_Address + BASE_Path + VALIDATE_REQUEST_TOKEN_W_LOGIN_Path;
var query = new Dictionary<string, string>();
query.Add(API_KEY_Key, _settings.ApiKey);
string requestUri = QueryHelpers.AddQueryString(baseUrl, query);
var jsonObj = new { username = username, password = password, request_token = requestToken };
string json = JsonConvert.SerializeObject(jsonObj);
var content = new StringContent(json, encoding: Encoding.UTF8, mediaType: "application/json");

Ожидаемое поведение: если Dotfuscator не может определить, безопасно ли переименовывать анонимные свойства, он не должен их переименовывать.

Рассмотреть возможность:

  1. Если пользователь активно назвал свойство анонимных типов, это должно быть подозрительно. Обратите внимание, что единственной причиной использования примера example0 вместо более короткого примера example2 (см. выше) является защита от переименования типов в Visual Studio. В примере 0, даже если вы переименуете переменную prop_1 или prop_2, это не нарушит анонимное имя типа и, следовательно, результирующий объект Json.

  2. Если метод или какой-либо вызываемый подметод использует сериализацию, то переименование свойства наверняка нарушит код. (поскольку имя типа в сериализованном Json будет зависеть от исходного имени свойства, поскольку нет объявленных пользователем атрибутов для именования сериализации)

Теперь вопрос: можете ли вы порекомендовать мне какой-нибудь атрибут или трюк, который сохранит мой текущий код, но гарантирует, что Dotfuscator ничего не переименует в методе/анонимном типе?


person J4ni    schedule 28.08.2019    source источник


Ответы (1)


Примечание: я отвечаю здесь в своем профессиональном качестве сотрудника разработчика Dotfuscator.

Начиная с версии 5.34, сообщество Dotfuscator включает правило ссылки по умолчанию для исключения свойств из сгенерированных анонимных типов. (Последнюю версию сообщества Dotfuscator можно загрузить с здесь). Кроме того, вы можете определить правило вручную. который:

Исключить все свойства из типов с именем .*AnonymousType.*, содержащих настраиваемый атрибут System.Runtime.CompilerServices.CompilerGeneratedAttribute.

<type name=".*AnonymousType.*" regex="true" excludetype="false">
    <customattribute name="System\.Runtime\.CompilerServices\.CompilerGeneratedAttribute" regex="true" />
    <propertymember name="*" regex="true" />
</type>
person mletterle    schedule 28.08.2019
comment
Спасибо за быстрый повтор, Майкл, я попробую ваше предложение позже! Обратите внимание, что у меня есть новая установка Dotfuscator Community (5.42), загруженная и настроенная, как описано на сайте preemptive.com для моего проекта Xamarin.Forms. При просмотре DotfuscatorConfig.xml в папке проектов нет записи, похожей на то, что вы скопировали. Однако в пользовательском интерфейсе указано это правило... Тем не менее, как я уже сказал, запутанная сборка имеет переименованные анонимные типы, сгенерированные компилятором. .. - person J4ni; 28.08.2019
comment
У меня есть это в файле конфигурации: -427b-8F72-A7A413ECDF1A} /› ‹referencerule rulekey={2B7E7C8C-A39A-4db8-9DFC-6AFD38509061} /› ‹referencerule rulekey={494EA3BA-B947-44B5-BEE8-A11CC85AAF9B} /› ‹referencerule{77-799rule=reference8rule 93E9-4e71-8D92-BE70E855ACFC} /› ‹referencerule rulekey={4D81E604-A545-4631-8B6D-C3735F793F80} /› - person J4ni; 28.08.2019
comment
Ключ referencerule для правила свойств анонимного типа: {62bd3899-7d53-4336-8ca2-4e5dbae187d5} Если файл конфигурации был создан до того, как это правило было добавлено по умолчанию, его может не быть, проверьте его и пересохраните файл конфигурации (или вручную добавьте его в список в файле конфигурации). файл) должны привести к тому, что эти свойства сохранят свои исходные метаданные. - person mletterle; 28.08.2019
comment
Последний ключ, кажется, сделал свое дело. Обратите внимание, что его не было в моем DotfuscatorConfig.xml, хотя это была новая чистая установка с шагами с домашней страницы. - person J4ni; 28.08.2019