1

このフォームを難読化して「デバッグ」すると

public partial class Form1 : Form
{
  public void Form1()
  {
    InitializeComponents();
  }

  protected override void OnShown(EventArgs e)
  {
      base.OnShown(e);
      Console.WriteLine("Name: "+this.Name);
      Console.WriteLine("FullName: "+this.GetType().FullName);
  }
}

出力は次のようになります。

名前: Form1
フルネーム: #Yab.#Zab


質問
なぜFullName難読化されているのですか?
Form1public であるため、SmartAssembly はそれを無視すると思います。

追加情報
Form1public partial、designer.cs です。

私の SmartAssembly セットアップは次のようになります。

    <ApplicationName />
    <Destination DestinationFileName=".\bin.obfuscated\MyProject.Form1.exe" />
    <Assemblies>
        <Assembly AssemblyName="MyProject.Form1, Culture=neutral, PublicKeyToken=omitted">
            <Merging>
                <ResourcesCompression Compress="0" />
                <MemberRefsProxy />
                <Pruning />
                <Obfuscation Obfuscate="1">
                  <Exclusions />
                </Obfuscation>
                <ControlFlow Obfuscate="1" />
            </Merging>
        </Assembly>
    </Assemblies>
    <Options>
      <Obfuscation FieldsNameMangling="2" NameMangling="1" />
      <ExceptionReporting />
      <FeatureUsageReporting Template="res:SmartUsageWithUIConsentFirstRun1033.dll" />
      <StrongNameSigning KeyFileName="PathToKeyFile" Sign="1" />
      <OtherProtections />
      <StringsEncoding />
      <OtherOptimizations />
      <Debugging />
    </Options>
4

1 に答える 1

2

まず、パブリック クラスは、アプリケーション プロジェクトの SmartAssembly によって無視されません (ライブラリ プロジェクトでは無視されます)。

次に、フォームのName プロパティは実行時に設定されるプロパティです。あなたの場合、コードのどこか、おそらくデザイナーで「Form1」に初期化される可能性があります。

この値はいつでも変更できます。例:

public Form1()
{
    InitializeComponent();
    this.Name = "foo";
}

そのため、SmartAssembly はこの値を難読化できません。これは誤りであり、コードの動作を変更する可能性があります。

SmartAssembly がコードを難読化すると、型、フィールド、およびメソッドの名前のみが変更されます。タイプの名前を取得しようとするとき、難読化されたタイプの名前を取得するのは論理的です。

于 2014-06-12T13:33:22.637 に答える