Vermeiden Sie das Verschleiern von Assemblys, die Klassen im System.Xml-Namespace in Dotfuscator verwenden, die Fehler verursachen

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Überprüfen der Symptome

Erstellen Sie ein neues Projekt. Es kann Windows Form oder WPF sein, aber hier erstellen wir eine WPF-Anwendung.

Schreiben Sie Code zur Verwendung von Klassen, die zum System.Xml-Namespace gehören. Hier verwenden wir die Klassen "XmlDocument" und "XmlNode" wie folgt.

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 名前空間のクラスを使用したコード

Wählen Sie nach dem Erstellen "PreEmptive Dotfuscator and Analytics" aus den Tools im Menü und starten Sie es.

PreEmptive Dotfuscator and Analytics を起動

Fügen Sie die .exe Datei hinzu, die Sie erstellt haben, und erstellen Sie sie.

.exe ファイルを追加

Dann wird die folgende Fehlermeldung angezeigt, und der Build schlägt fehl.

Dies ist kein verwaltetes Modul (C:\Programme (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\ja\System.Xml.dll). Build-Fehler.

ビルドエラー

Ich habe versucht herauszufinden, was diesen Fehler verursacht hat, aber ich konnte keine klare Antwort finden. Wenn man bedenkt, dass es auf der englischen Website keine Informationen gibt und dass der Pfad System.Xml.dll "en" hat, können Sie vermuten, dass es sich um einen anderen eindeutigen Fehler als die englische Umgebung handelt.

Problemumgehung

Obwohl das Projekt auf den Windows-Client System.Xml.dll verweist, verweist es beim Erstellen mit Dotfuscator auf die Assembly in der Windows Phone-Datei System.Xml.dll sodass wir die Datei System.Xml lokal erzwungen kopiert haben.dll Ich möchte Build-Fehler vermeiden, indem ich mich darauf beziehe.

Öffnen Sie die Verweise des Projekts, klicken Sie mit der rechten Maustaste auf System.Xml, und wählen Sie Eigenschaften aus.

プロパティを選択

Ändern Sie das Element in der lokalen Kopie in True.

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

Wenn Sie in diesem Zustand erstellen, wird "System.Xml.dll" zusammen mit der .exe Datei ausgegeben.

System.Xml.dll が出力される

Öffnen Sie Dotfuscator, und fügen Sie "System.Xml.dll" zusammen mit der Assembly hinzu, die Sie verschleiern möchten. Dadurch wird die Assembly verschleiert, sodass sie nicht auf die DLL des installierten Frameworks verweist und die lokale DLL sieht.

Beachten Sie, dass die System.Xml.dll-Eigenschaft den Bibliotheksmodus überprüft. Ohne diese Überprüfung kann auch System.Xml.dll verschleiert werden, und die Klassennamen, auf die es verweist, können sich ändern. Wenn sich der Klassenname ändert, können Sie die Anwendung natürlich nicht normal starten.

System.Xml.dll を追加

Wenn Sie in diesem Zustand erstellen, wird er erfolgreich abgeschlossen.

ビルド成功

Sie können sicher sein, dass die verschleierte Anwendung ohne Probleme von selbst startet.

アプリケーションを起動

Der hier vorgestellte Inhalt ist ein Workaround auf eine etwas knifflige Art und Weise, so dass wir nicht garantieren können, dass er auch für Baugruppen, die entsprechend konstruiert wurden, wirksam ist. Selbst wenn der Build erfolgreich ist und gestartet werden kann, ist die Möglichkeit nicht zu leugnen, dass er bei der Durchführung eines bestimmten Prozesses abstürzt, also überprüfen Sie bitte den Vorgang vor der Veröffentlichung ordnungsgemäß.

Auch wenn sie nicht auf den System.Xml-Namespace beschränkt ist, ist die Verschleierung ein sensibles Feature, das Sie sicherstellen müssen, dass die Konsistenz gewahrt bleibt. Insbesondere bei der Verwendung von Reflektion sind E/A-bezogene Dinge wie Datei-E/A und Interaktion mit externen APIs wahrscheinlich betroffen, also seien Sie vorsichtig.