避免在 Dotfuscator 中使用系統.Xml 命名空間中的類對程式集進行模糊處理時出錯的癥狀

更新頁 :
頁面創建日期 :

檢查癥狀

創建新專案。 您可以使用 Windows 表單或 WPF,但我們正在創建 WPF 應用程式。

編寫代碼以使用屬於 System.Xml 命名空間的類。 此處使用 Xml 文件和 Xml 節點類,如下所示:

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 を起動

添加並生成您創建的 .exe 檔案。

.exe ファイルを追加

然後產生失敗,並顯示以下錯誤訊息:

這不是託管模組(C:\Program Files (x86)\參考程式集\Microsoft\框架工作\Silverlight\v4.0\配置檔\WindowsPhone71\ja\System.xml.dll)。 生成錯誤。

ビルドエラー

我試圖找出此錯誤的原因,但找不到明確的答案。 考慮到英語網站沒有信息,並且 System.Xml.dll 的路徑上有一個“ja”,您可以推斷出除了英語環境之外,還有其他特定錯誤。

解決方法

儘管專案引用 Windows 用戶端的系統.xml.dll,但在使用文檔管理器生成時,Windows 電話系統.xml.dll 引用程式集,因此此處強制本地複製的系統.xml.dll 我想通過引用來避免生成錯誤。

打開專案的引用設置,右鍵按下 System.Xml,然後選擇「屬性」。

プロパティを選択

將本地副本中的項更改為 True。

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

在此狀態下生成時,「System.xml.dll」將隨 .exe 檔一起輸出。

System.Xml.dll が出力される

打開 Dotfuscator 並添加「系統.xml.dll以及要模糊處理的程式。 現在,模糊處理程式集將看到本地 DLL,而不引用已安裝框架的 DLL。

請注意,檢查 System.Xml.dll 屬性中的“庫模式”。 如果沒有此檢查,System.Xml.dll 也可能被模糊處理,並且引用的類名稱可能會更改。 當然,如果類名稱發生更改,應用程式將無法成功啟動。

System.Xml.dll を追加

在此狀態下生成將成功完成。

ビルド成功

您可以驗證模糊的應用程式是否自行啟動,沒有任何問題。

アプリケーションを起動

由於此處介紹的是一種稍微複雜的解決方法,因此不能保證它對構建的程式集有效。 即使生成成功啟動,也不可否認,在執行某些操作時可能會失敗,因此請在發佈之前驗證其工作正常。

模糊處理(而不僅僅是 System.Xml 命名空間)是一個微妙的功能,必須確保一致性。 請注意,I/O 關聯(如使用反射或與檔 I/O 和外部 API 的交互)特別敏感。