避免在 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;
}
}
}
生成后,从菜单中的工具中选择“高级适配器和分析”以启动它。
添加并生成您创建的 .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。
在此状态下生成时,“System.xml.dll”将随 .exe 文件一起输出。
打开 Dotfuscator 并添加“系统.xml.dll以及要模糊处理的程序。 现在,模糊处理程序集将看到本地 DLL,而不引用已安装框架的 DLL。
请注意,检查 System.Xml.dll 属性中的“库模式”。 如果没有此检查,System.Xml.dll 也可能被模糊处理,并且引用的类名称可能会更改。 当然,如果类名称发生更改,应用程序将无法成功启动。
在此状态下生成将成功完成。
您可以验证模糊的应用程序是否自行启动,没有任何问题。
由于此处介绍的是一种稍微复杂的解决方法,因此不能保证它对构建的程序集有效。 即使生成成功启动,也不可否认,在执行某些操作时可能会失败,因此请在发布之前验证其工作正常。
模糊处理(而不仅仅是 System.Xml 命名空间)是一个微妙的功能,必须确保一致性。 请注意,I/O 关联(如使用反射或与文件 I/O 和外部 API 的交互)特别敏感。