Vermijd het verduisteren van assembly's die klassen in de System.Xml-naamruimte in Dotfuscator gebruiken die fouten veroorzaken
De symptomen controleren
Maak een nieuw project. Het kan Windows Form of WPF zijn, maar hier maken we een WPF-applicatie.
Schrijf code om klassen te gebruiken die tot de System.Xml-naamruimte behoren. Hier gebruiken we de klassen "XmlDocument" en "XmlNode" als volgt.
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;
}
}
}
Selecteer na het bouwen "PreEmptive Dotfuscator and Analytics" in de tools in het menu en start het.
Voeg het .exe bestand toe dat u hebt gemaakt en bouw het.
Vervolgens wordt het volgende foutbericht weergegeven en mislukt de build.
Dit is geen beheerde module (C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\ja\System.Xml.dll). Build fout.
Ik probeerde erachter te komen wat deze fout veroorzaakte, maar ik kon geen duidelijk antwoord vinden. Gezien het feit dat er geen informatie op de Engelse site staat en dat het System.Xml.dll pad "en" heeft, kunt u raden dat het een unieke fout is anders dan de Engelse omgeving.
Tijdelijke oplossing
Hoewel het project verwijst naar de Windows-client System.Xml.dll, verwijst het, wanneer u met Dotfuscator bouwt, naar de assembly in het Windows Phone System.Xml.dll dus hebben we de System.Xml lokaal met geweld gekopieerd.dll Ik wil bouwfouten voorkomen door ernaar te verwijzen.
Open de referenties van het project, klik met de rechtermuisknop op System.Xml en kies Eigenschappen.
Wijzig het item in de lokale kopie in True.
Wanneer u deze status inbouwt, wordt "System.Xml.dll" samen met het .exe-bestand uitgevoerd.
Open Dotfuscator en voeg "System.Xml.dll" toe, samen met de assembly die u wilt verbergen. Hierdoor wordt de assembly verduisterd, zodat deze niet verwijst naar de DLL van het geïnstalleerde framework en de lokale DLL wordt weergegeven.
De eigenschap System.Xml.dll controleert de bibliotheekmodus. Zonder deze controle kan System.Xml.dll ook worden verduisterd en kunnen de klassenamen waarnaar het verwijst, worden gewijzigd. Als de naam van de klasse verandert, kunt u de toepassing natuurlijk niet normaal starten.
Als u in deze staat bouwt, wordt deze met succes voltooid.
U kunt er zeker van zijn dat de verduisterde toepassing zonder problemen vanzelf wordt gestart.
De inhoud die hier wordt gepresenteerd, is een tijdelijke oplossing op een enigszins lastige manier, dus we kunnen niet garanderen dat het effectief zal zijn, zelfs voor assemblages die dienovereenkomstig zijn gebouwd. Zelfs als de build succesvol is en kan worden gestart, valt niet te ontkennen dat deze zal vallen bij het uitvoeren van een specifiek proces, dus controleer de bewerking goed voordat u deze vrijgeeft.
Zelfs als het niet beperkt is tot de System.Xml-naamruimte, is verduistering een gevoelige functie die u nodig hebt om ervoor te zorgen dat de consistentie behouden blijft. Met name bij het gebruik van reflectie worden I/O-gerelateerde zaken zoals bestands-I/O en interactie met externe API's waarschijnlijk beïnvloed, dus wees voorzichtig.