chosenOne Thabs
chosenOne Thabs

Reputation: 1640

PreEmptive Dotfuscator not working on Xamarin

I'm using PreEmptive Obfuscator (Dotfuscator) to obfuscate a Xamarin app. My problem is that the Obfuscator doesn't obfuscate my project dlls. When i open the dll after obfuscation i still see readable information. The obfuscation tool automatically opens when i click build/rebuild button - this proves that i linked/configured it properly.

What could be the problem ? Please see the screenshot below :

enter image description here

My project file code :

  <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
   <DotfuscatorXamarinCliPath>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\Extensions\PreEmptiveSolutions\DotfuscatorCE\dotfuscatorCLI.exe</DotfuscatorXamarinCliPath>
    <DotfuscatorXamarinConfigFileName>DotfuscatorConfig.xml</DotfuscatorXamarinConfigFileName>
    <DotfuscatorXamarinGenerateNewConfigFile>true</DotfuscatorXamarinGenerateNewConfigFile> 

    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{88F1AA1B-4608-40F7-B14D-C7E28099A26E}</ProjectGuid>
    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>TestDotObfuscator</RootNamespace>
    <AssemblyName>TestDotObfuscator</AssemblyName>
    <FileAlignment>512</FileAlignment>
    <AndroidApplication>True</AndroidApplication>
    <AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
    <AndroidResgenClass>Resource</AndroidResgenClass>
    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
    <AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
    <TargetFrameworkVersion>v6.0</TargetFrameworkVersion>
    <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>True</DebugSymbols>
    <DebugType>Full</DebugType>
    <Optimize>False</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <AndroidUseSharedRuntime>True</AndroidUseSharedRuntime>
    <AndroidLinkMode>None</AndroidLinkMode>
    <EmbedAssembliesIntoApk>False</EmbedAssembliesIntoApk>
    <AotAssemblies>false</AotAssemblies>
    <EnableLLVM>false</EnableLLVM>
    <BundleAssemblies>false</BundleAssemblies>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DotfuscatorXamarinEnabled>true</DotfuscatorXamarinEnabled> 
    <DebugSymbols>True</DebugSymbols>
    <DebugType>PdbOnly</DebugType>
    <Optimize>True</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <AndroidManagedSymbols>true</AndroidManagedSymbols>
    <AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>
    <AndroidLinkMode>SdkOnly</AndroidLinkMode>
    <EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>
    <AotAssemblies>false</AotAssemblies>
    <EnableLLVM>false</EnableLLVM>
    <BundleAssemblies>false</BundleAssemblies>
    <AndroidCreatePackagePerAbi>true</AndroidCreatePackagePerAbi>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Xml" />
    <Reference Include="System.Core" />
    <Reference Include="Mono.Android" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="DB.cs" />
    <Compile Include="MainActivity.cs" />
    <Compile Include="Resources\Resource.Designer.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <None Include="GettingStarted.Xamarin" />
    <None Include="Resources\AboutResources.txt" />
    <None Include="Properties\AndroidManifest.xml" />
    <None Include="Assets\AboutAssets.txt" />
  </ItemGroup>
  <ItemGroup>
    <AndroidResource Include="Resources\layout\Main.axml">
      <SubType>Designer</SubType>
    </AndroidResource>
    <AndroidResource Include="Resources\values\Strings.xml" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="Resources\drawable\" />
    <Folder Include="Resources\mipmap-hdpi\" />
    <Folder Include="Resources\mipmap-mdpi\" />
    <Folder Include="Resources\mipmap-xhdpi\" />
    <Folder Include="Resources\mipmap-xxhdpi\" />
    <Folder Include="Resources\mipmap-xxxhdpi\" />
  </ItemGroup>
  <ItemGroup>
    <None Include="DotfuscatorConfig.xml" />
  </ItemGroup>
  <Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
        <Target Name="BeforeBuild">
        </Target>
        <Target Name="AfterBuild">
        </Target>
    -->
  <Import Project="..\..\PreEmptive.Dotfuscator.Xamarin.targets" />
</Project>

Upvotes: 2

Views: 3120

Answers (2)

Joe Sewell
Joe Sewell

Reputation: 6620

When Dotfuscator Community Edition is installed (to C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\Extensions\PreEmptiveSolutions\DotfuscatorCE in your case), dotfuscator.exe is the graphical user interface (GUI), and dotfuscatorCLI.exe is the command line interface (CLI). (The names and path differ for Professional Edition.)

Based on your edited question and responses to comments, it seems you have somehow replaced dotfuscatorCLI.exe with a copy of dotfuscator.exe. When the Visual Studio build integration calls dotfuscatorCLI.exe, it expects the command line to run, not the GUI.

Please uninstall, then reinstall Dotfuscator Community Edition:

  1. Close all instances of Visual Studio 2017.
  2. From the Start Menu, open the Visual Studio Installer.
  3. Under "Visual Studio Community 2017", select Modify (it may be under the More drop-down).
  4. Select the Individual Components tab.
  5. Scroll down to the Code tools section and uncheck the box for PreEmptive Protection - Dotfuscator.
  6. Click Modify.
  7. When the uninstall is complete, open Modify again.
  8. Select the Individual Components tab.
  9. Scroll down to the Code tools section and check the box for PreEmptive Protection - Dotfuscator.
  10. Click Modify.
  11. When the installation is complete, open a command prompt.
  12. Run: cd "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\Extensions\PreEmptiveSolutions\DotfuscatorCE"
  13. Run: dotfuscator.exe.
  14. Verify that the graphical user interface (GUI) opens.
  15. Return to the command prompt and run: dotfuscatorCLI.exe.
  16. Verify that help text is displayed in the command prompt, and the graphical user interface (GUI) does not open.

Then, assuming you have registered Community Edition, you should be able to run your Dotfuscator-integrated Xamarin build in Visual Studio, and the GUI should not open when you do so.

Disclaimer: As mentioned in the comments, I also work on the Dotfuscator team, and am answering this question in that capacity.

Upvotes: 2

Nathan Arthur
Nathan Arthur

Reputation: 1182

It sounds like maybe you configured the integration to use the GUI executable, rather than the CLI (build) executable. If you are seeing the Dotfuscator GUI appear each time you build your Xamarin app, that's probably the issue.

Depending on whether you are using Dotfuscator Community Edition or Dotfuscator Professional, the executable name might be different. For CE, use dotfuscatorCLI.exe. For Pro, use dotfuscator.exe.

Full disclosure: I work for PreEmptive Solutions, the company that makes Dotfuscator.

Upvotes: 1

Related Questions