Избегайте обфускации сборок, использующих классы в пространстве имен System.Xml в Dotfuscator, которые вызывают ошибки

Страница обновлена :
Дата создания страницы :

Проверка симптомов

Создайте новый проект. Это может быть Windows Form или WPF, но здесь мы создаем приложение WPF.

Напишите код для использования классов, принадлежащих пространству имен System.Xml. Здесь мы используем классы "XmlDocument" и "XmlNode" следующим образом.

using System.Windows;
using System.Xml;

namespace DotfuscatorTest
{
  /// <summary>MainWindow.xaml の相互作用ロジック</;summary>
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();

      XmlDocument doc = new XmlDocument();
      doc.LoadXml("<a></a>");
      XmlNode node = doc.FirstChild;
    }
  }
}

System.Xml 名前空間のクラスを使用したコード

После сборки выберите «PreEmptive Dotfuscator and Analytics» из инструментов в меню и запустите его.

PreEmptive Dotfuscator and Analytics を起動

Добавьте созданный .exe файл и выполните его сборку.

.exe ファイルを追加

Затем появляется следующее сообщение об ошибке и выполняется сбой сборки.

Это не управляемый модуль (C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\ja\System.Xml.dll). Ошибка сборки.

ビルドエラー

Я попытался выяснить, что стало причиной этой ошибки, но не смог найти четкого ответа. Учитывая, что на английском сайте нет информации и что путь System.Xml.dll имеет «en», можно догадаться, что это уникальная ошибка, отличная от английской среды.

Временное решение

Несмотря на то, что проект ссылается на клиент Windows System.Xml.dll, при сборке с помощью Dotfuscator он ссылается на сборку в Windows Phone System.Xml.dll поэтому мы принудительно скопировали System.Xml локально.dll Я хотел бы избежать ошибок сборки, ссылаясь на него.

Откройте ссылки на проект, щелкните правой кнопкой мыши файл System.Xml и выберите пункт Свойства.

プロパティを選択

Измените элемент в локальной копии на True.

ローカル コピーの項目を True に変更

При построении в этом состоянии выводится "System.Xml.dll" вместе с .exe файлом.

System.Xml.dll が出力される

Откройте Dotfuscator и добавьте "System.Xml.dll" вместе со сборкой, которую вы хотите запутать. Это запутывает сборку, чтобы она не ссылалась на библиотеку DLL установленной платформы и видела локальную библиотеку DLL.

Обратите внимание, что свойство System.Xml.dll проверяет режим библиотеки. Без этой проверки System.Xml.dll также может быть запутан, а имена классов, на которые он ссылается, могут измениться. Конечно, если имя класса изменится, вы не сможете запустить приложение в обычном режиме.

System.Xml.dll を追加

Если вы выполните сборку в этом состоянии, она будет успешно завершена.

ビルド成功

Вы можете быть уверены, что обфускированное приложение запускается самостоятельно без проблем.

アプリケーションを起動

Представленное здесь содержимое является обходным путем несколько сложным способом, поэтому мы не можем гарантировать, что оно будет эффективным даже для сборок, которые были построены соответствующим образом. Даже если сборка успешна и может быть запущена, нельзя отрицать вероятность того, что она упадет при выполнении определенного процесса, поэтому, пожалуйста, проверьте операцию должным образом перед выпуском.

Даже если это не ограничивается пространством имен System.Xml, обфускация является конфиденциальной функцией, необходимой для обеспечения согласованности. В частности, при использовании отражения могут быть затронуты связанные с вводом-выводом такие вещи, как файловый ввод-вывод и взаимодействие с внешними API, поэтому будьте осторожны.