3

我尝试了 Smart Assembly,对此非常满意。它的错误报告功能很棒。依赖集成也是非常酷的功能。我的问题是有像 Smart Assembly 这样的免费替代品吗?

我尝试了 Eazfuscator.NET,它是很棒的混淆器,但缺少 Smart Assembly 中我最喜欢的两个。是否有任何免费工具可用于 .Net 框架的错误报告和依赖项集成。

4

2 回答 2

6

在阅读Eazfuscator.NET的文档时,我发现它包含两个功能,称为程序集合并和程序集嵌入。为了报告错误,我创建了自己的库。你可以在CodePlex CrashReporter.NET找到这个库

任何人都可以按照以下说明使用程序集合并或嵌入

程序集合并

介绍

程序集合并允许将多个程序集合并为一个。从部署和安全的角度来看,这可能是有益的。

组件合并技术在下面使用 ILMerge 实用程序。因此,为了使用程序集合并,请确保您的机器上安装了 ILMerge。通过单独使用 ILMerge 实用程序也可以实现程序集合并,但在大多数情况下,使用 Eazfuscator.NET 提供的程序集合并接口会更方便。

使用从 Eazfuscator.NET 合并的程序集与直接使用 ILMerge 的好处

Eazfuscator.NET 在 Eazfuscator.NET Assistant 的帮助下自动集成到项目构建过程中。在直接使用 ILMerge 的情况下,您必须手动为项目编写构建事件处理程序 Eazfuscator.NET 神奇地处理项目的签名选项。在直接使用 ILMerge 的情况下,您必须手动为其提供签名密钥和选项 Eazfuscator.NET 为 ILMerge 提供目标平台信息,这些信息是从输入程序集中自动检测到的。在直接使用 ILMerge 的情况下,您必须手动提供此信息 Eazfuscator.NET 为 ILMerge 提供所有必需的选项,因此您不必阅读 ILMerge 手册。它大大加快了集成速度

默认情况下,在程序集的混淆过程中不使用程序集合并。

指示

要启用程序集合并,您应该将特殊形成的属性应用于您的程序集。为此,您可以使用以下说明。

启用程序集合并的说明

在 IDE 中打开可混淆项目 将新的源文件添加到项目中并将其命名为 ObfuscationSettings.cs(对于 C#)或 ObfuscationSettings.vb(对于 Visual Basic .NET)。您可能更喜欢使用其他名称而不是 ObfuscationSettings.cs 或 ObfuscationSettings.vb 使用以下内容 (C#) 填充 ObfuscationSettings.cs:

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "merge with XXXXXX.dll", Exclude = false)]

对于 Visual Basic .NET,使用以下内容填充 ObfuscationSettings.vb:

Imports System
Imports System.Reflection

<Assembly: Obfuscation(Feature:="merge with XXXXXX.dll", Exclude:=False)> 

笔记

将 XXXXXX.dll 更改为要合并的程序集的文件名。

提示

如果要与多个程序集合并,则只需添加几个属性:

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "merge with Assembly1.dll", Exclude = false)]
[assembly: Obfuscation(Feature = "merge with AnotherAssembly2.dll", Exclude = false)]
…

注意 使用程序集合并可能会导致一些副作用,这可能会导致混淆失败。如果是这种情况,则使用最小公分母原则——仅合并那些不会导致混淆失败的程序集。程序集嵌入可以结合使用或作为程序集合并的替代方法。

ILMerge 的自定义参数

有时您可能需要将自定义参数传递给 ILMerge 实用程序。例如,您可能更喜欢自己控制类内部化或使用一些棘手的 ILMerge 功能。为此,您可以使用以下说明。

将自定义参数传递给 ILMerge 的说明

在 IDE 中打开可混淆项目 将新的源文件添加到项目中并将其命名为 ObfuscationSettings.cs(对于 C#)或 ObfuscationSettings.vb(对于 Visual Basic .NET)。您可能更喜欢使用其他名称而不是 ObfuscationSettings.cs 或 ObfuscationSettings.vb 使用以下内容 (C#) 填充 ObfuscationSettings.cs:

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "ilmerge custom parameters: <parameters>", Exclude = false)]

对于 Visual Basic .NET,使用以下内容填充 ObfuscationSettings.vb:

Imports System
Imports System.Reflection

<Assembly: Obfuscation(Feature:="ilmerge custom parameters: <parameters>", Exclude:=False)> 

笔记

使用您要传递的参数进行更改。当没有定义属性时,Eazfuscator.NET 默认传递 /internalize /ndebug 参数。如果您不想将任何参数传递给 ILMerge,请使用无字符串进行更改。

程序集嵌入指令

装配体嵌入

介绍

程序集嵌入允许将程序集的依赖项嵌入程序集本身。从部署和安全的角度来看,这可能是有益的。

程序集嵌入类似于合并。主要区别在于程序集在嵌入时不会合并为单个程序集。它们只是被加密并打包为程序集资源。结果,输出中只有一个程序集,它包含同一文件中的打包依赖项。

当我们合并时嵌入有什么意义(反之亦然)?装配体合并为生成的装配体提供最佳性能。它们可以是 NGENed,它们可以在所有受限环境(Windows Phone、Compact Framework 等)中工作。操作系统可以为此类程序集缓存文件映射和 JIT 代码,从而带来令人眼花缭乱的快速应用程序启动。装配合并绝对是岩石。

合并的唯一缺点是它并不总是可以在不破坏应用程序的情况下应用它。因此,这就是程序集嵌入发挥作用的地方。

嵌入式组件很容易实现,而且开箱即用。缺点?好吧,他们在场。嵌入式程序集不能 NGENed,它们在某些受限环境(Xbox、Windows Phone 和 Compact Framefork)中不起作用。在应用程序加载期间提取嵌入式程序集是一种性能损失(损失非常小,因此您不太可能注意到它)。

程序集嵌入也带来了一些好处。嵌入式程序集是加密的,因此这是针对黑客的安全加固。嵌入式组件被压缩,从而减小了最终组件的尺寸。当然,程序集嵌入是实现单文件部署的最简单方法,使您的应用程序由单个 .exe(或 .dll)文件组成。

指示

要启用程序集嵌入,您应该将特殊形成的属性应用于您的程序集。为此,您可以使用以下说明。启用程序集嵌入的说明

在 IDE 中打开可混淆项目 将新的源文件添加到项目中并将其命名为 ObfuscationSettings.cs(对于 C#)或 ObfuscationSettings.vb(对于 Visual Basic .NET)。您可能更喜欢使用其他名称而不是 ObfuscationSettings.cs 或 ObfuscationSettings.vb 使用以下内容 (C#) 填充 ObfuscationSettings.cs:

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "embed XXXXXX.dll", Exclude = false)]

对于 Visual Basic .NET,使用以下内容填充 ObfuscationSettings.vb:

Imports System
Imports System.Reflection

<Assembly: Obfuscation(Feature:="embed XXXXXX.dll", Exclude:=False)> 

笔记

将 XXXXXX.dll 更改为您要嵌入的程序集的文件名。

重要的

建议对嵌入式程序集进行模糊处理。
提示

当仅提供文件名时,Eazfuscator.NET 会自动查找程序集路径。如果您希望指定程序集的确切文件路径,则可以使用脚本变量:

[assembly: Obfuscation(Feature = @"embed $(InputDir)\Lib\AssemblyToEmbed.dll", Exclude = false)]

提示

如果要嵌入多个程序集,则只需添加几个属性:

[assembly: Obfuscation(Feature = "embed Assembly1.dll", Exclude = false)]
[assembly: Obfuscation(Feature = "embed AnotherAssembly2.dll", Exclude = false)]
…

调音

默认情况下,嵌入式程序集被压缩和加密。您可能更喜欢关闭压缩、加密或两者。为此,请阅读以下说明。

程序集嵌入的自定义属性的完整表示法具有以下形式:

[assembly: Obfuscation(Feature = "embed [flags] XXXXXX.dll", Exclude = false)]

其中 [flags] 是由空格分隔的标志的可选枚举。

下表列出了可用标志的列表。

下面是程序集嵌入属性的标志列表

标志 说明 no_compress 禁用压缩 no_encrypt 禁用加密 no_satellites 禁用附属程序集的自动嵌入 load_from_file 指示 Eazfuscator.NET 在混淆程序集运行时从文件而不是内存加载嵌入程序集。这可用于从 System.Reflection.Assembly 类型中保留有意义的 Location 属性值。

让我们看一下例子。

例 4.24。无需压缩和加密的嵌入程序集

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "embed [no_compress no_encrypt] XXXXXX.dll", Exclude = false)]

例 4.25。无需加密的嵌入程序集;启用压缩

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "embed [no_encrypt] XXXXXX.dll", Exclude = false)]

例 4.26。嵌入装配;启用压缩和加密

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "embed XXXXXX.dll", Exclude = false)]

例 4.27。嵌入自己的卫星组件;启用压缩和加密

using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "embed satellites", Exclude = false)]

故障排除虽然程序集嵌入是链接程序集的最非侵入性方式,但可能会出现一些罕见的问题。本章描述了可能出现的问题以及避免这些问题的相应解决方案。System.Reflection.Assembly 类问题摘要的位置属性。System.Reflection.Assembly 类的 Location 属性通常用于查找程序集附近文件的路径。虽然不是正确的解决方案,但这适用于大多数部署方案。

可能会出什么问题?首先,在使用程序集卷影复制时,Location 属性可能具有完全意外的值,从而破坏了预期的应用程序逻辑。其次,当嵌入相应的程序集时,Location 属性具有空值。

解决方案。请改用 EscapedCodeBase 属性。此属性在所有部署方案中始终具有正确的值。请看下面的示例。

using System;

class Program
{
    static string GetEulaPath()
    {
        var assembly = typeof(Program).Assembly;
        // string location = assembly.Location; // Please do not use this. This is a flawed approach
        string location = new Uri(assembly.EscapedCodeBase).LocalPath; // <-- Use this instead
        return Path.Combine(Path.GetDirectoryName(location), "EULA.rtf");
    }
}
于 2012-07-12T10:51:31.443 回答
3

对于错误报告,您可以尝试 N Bug。对于依赖项集成,您可以使用 ILMerge,

http://www.nbusy.com/projects/nbug

http://research.microsoft.com/en-us/people/mbarnett/ILMerge.aspx

顺便说一句,如果您真的喜欢 SmartAssembly,请考虑购买它。

于 2012-05-13T10:02:45.813 回答