PreEmptive Dotfuscator не работает на Xamarin

Я использую PreEmptive Obfuscator (Dotfuscator), чтобы запутать приложение Xamarin. Моя проблема в том, что Обфускатор не запутывает мои проектные библиотеки. Когда я открываю dll после запутывания, я все еще вижу читаемую информацию. Инструмент обфускации автоматически открывается, когда я нажимаю кнопку "построить / перестроить" - это доказывает, что я связал / настроил его правильно.

В чем может быть проблема? Пожалуйста, смотрите скриншот ниже:

введите описание изображения здесь

Код моего проекта:

  <?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>

2 ответа

Когда Dotfuscator Community Edition установлен (для C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\Extensions\PreEmptiveSolutions\DotfuscatorCE в твоем случае), dotfuscator.exe графический интерфейс пользователя (GUI), и dotfuscatorCLI.exe интерфейс командной строки (CLI) (Имена и пути отличаются для Профессионального издания.)

Судя по твоему отредактированному вопросу и ответам на комментарии, кажется, ты как-то заменил dotfuscatorCLI.exe с копией dotfuscator.exe, Когда сборка сборки Visual Studio вызывает dotfuscatorCLI.exe, он ожидает запуска командной строки, а не GUI.

Пожалуйста, удалите, а затем переустановите Dotfuscator Community Edition:

  1. Закройте все экземпляры Visual Studio 2017.
  2. В меню "Пуск" откройте установщик Visual Studio.
  3. В разделе "Visual Studio Community 2017" выберите " Изменить" (возможно, в раскрывающемся списке "Дополнительно").
  4. Выберите вкладку " Отдельные компоненты ".
  5. Прокрутите вниз до раздела Инструменты кода и снимите флажок для PreEmptive Protection - Dotfuscator.
  6. Нажмите Изменить.
  7. Когда удаление будет завершено, снова откройте Изменить.
  8. Выберите вкладку " Отдельные компоненты ".
  9. Прокрутите вниз к разделу Инструменты кода и установите флажок для PreEmptive Protection - Dotfuscator.
  10. Нажмите Изменить.
  11. После завершения установки откройте командную строку.
  12. Бежать: cd "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\Extensions\PreEmptiveSolutions\DotfuscatorCE"
  13. Бежать: dotfuscator.exe,
  14. Убедитесь, что графический интерфейс пользователя (GUI) открывается.
  15. Вернитесь в командную строку и запустите: dotfuscatorCLI.exe,
  16. Убедитесь, что текст справки отображается в командной строке, а графический интерфейс пользователя (GUI) не открывается.

Затем, предполагая, что вы зарегистрировали Community Edition, вы сможете запускать сборку Xamarin, интегрированную с Dotfuscator, в Visual Studio, и графический интерфейс не должен открываться при этом.

Отказ от ответственности: Как уже упоминалось в комментариях, я также работаю в команде Dotfuscator и отвечаю на этот вопрос в этом качестве.

Похоже, что вы настроили интеграцию для использования исполняемого файла GUI, а не исполняемого файла CLI (сборки). Если вы видите, что графический интерфейс Dotfuscator появляется каждый раз, когда вы создаете свое приложение Xamarin, возможно, это проблема.

В зависимости от того, используете ли вы Dotfuscator Community Edition или Dotfuscator Professional, имя исполняемого файла может отличаться. Для CE используйте dotfuscatorCLI.exe, Для Pro используйте dotfuscator.exe,

Полное раскрытие: я работаю в PreEmptive Solutions, компании, которая производит Dotfuscator.

Другие вопросы по тегам