Search code examples
msbuildobfuscationmsbuild-taskmsbuildcommunitytasksdotfuscator

MSBUILD Dynamically Create Config XML Dotfuscator


I am trying to obfuscate bunch of files in a directory and every build there are more and more files being generated. I would like to know if there is a way I can dynamically create the Dotfuscator configuration xml file using a MSBUILD task that will generate the xml file every time there is a new file added to the directory?


Solution

  • This might be a good time to use the Directory input. Rather than representing a single assembly (.exe or .dll), this type of Dotfuscator input captures all the assemblies in a directory. When the contents of the directory change, Dotfuscator's build will automatically pick up any new assemblies.

    To make a Dotfuscator config file with a Directory input, open the GUI and add an input as you normally would (directions for Community Edition's GUI and for Professional Edition's standalone GUI), but instead of selecting a file from the Browse... dialog, just navigate to the directory and click "Open" while the "File name" is still listed as "Folder Select". Then, save your configuration.

    From now on, whenever you run Dotfuscator (whether from the standalone GUI, the command line, the Visual Studio integration, or the MSBuild task), all assemblies in the directory will be processed as input.

    Note: If you look at the config file itself, you might be surprised that it will still list individual assemblies:

    <input>
      <loadpaths />
      <asmlist>
        <package refid="19e1b0c5-7221-476f-af4b-bafef68edc95">
          <file dir="C:\code\BasicTestApp\BasicTestApp\bin" name="Debug" />
          <asmlist>
            <inputassembly refid="a6da5d8d-c181-4103-840d-d8cc7c85937a">
              <option>honoroas</option>
              <option>stripoa</option>
              <option>transformxaml</option>
              <file dir="" name="BasicTestApp.exe" />
            </inputassembly>
            <inputassembly refid="df84dad0-fbe8-49ab-b8c8-9fb59e706785">
              <option>honoroas</option>
              <option>stripoa</option>
              <option>library</option>
              <option>transformxaml</option>
              <file dir="" name="ClassLibrary.dll" />
            </inputassembly>
          </asmlist>
        </package>
      </asmlist>
    </input>
    

    Despite this layout, Dotfuscator will process all assemblies in the C:\code\BasicTestApp\BasicTestApp\bin\Debug directory when it runs a build based off this config file, not just those two listed. The assembly elements in the config are just there so that you can still make rules against individual assemblies in the GUI (e.g., to make one assembly be in Library Mode). The list represents the state of the directory when the GUI last modified the config.

    Disclaimer: I work for the Dotfuscator team, and am answering this question as part of my job.


    Additional note due to clarification in the comments: the directory package has a feature where you can exclude certain assemblies from obfuscation. These assemblies will be treated as a Package Artifact and just copied from input-to-output without modification. Any obfuscated assemblies that refer to these excluded assemblies will still be processed correctly.

    To do this in the GUI, right-click on the assembly within the package, and select "Exclude assembly from package". Or, if you'd prefer to edit the config file, add the following <option> tag as a child of each relevant <inputassembly> tag:

    <option>artifact</option>