具有错误报告和依赖性集成的SmartAssembly的免费替代方案

时间:2012-05-13 04:43:26

标签: c# .net obfuscation

我尝试过Smart Assembly并对它非常满意。它的错误报告功能很棒。依赖集成也是非常酷的功能。我的问题是有免费的替代品可以像智能装配一样工作吗?

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

2 个答案:

答案 0 :(得分:5)

在阅读Eazfuscator.NET的文档时,我发现它包含两个称为汇编合并和汇编嵌入的功能。为了报错,我创建了自己的库。您可以在CodePlex CrashReporter.NET

找到此库

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

  

装配合并

     

<强>简介

     

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

     

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

     

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

     

Eazfuscator.NET自动集成到项目构建中   在Eazfuscator.NET Assistant的帮助下进行处理。的情况下   直接使用ILMerge,你必须编写构建事件处理程序   手动项目Eazfuscator.NET神奇地处理签名选项   该项目。如果直接使用ILMerge,则必须提供它   手动签名密钥和选项Eazfuscator.NET提供   ILMerge具有自动的目标平台信息   从输入组件中检测到。在直接使用ILMerge的情况下,您   必须手动提供此信息Eazfuscator.NET提要   ILMerge包含所有必需选项,因此您无需阅读ILMerge   手册。它加快了整合速度

     

默认情况下,在模糊处理过程中不使用程序集合并   部件。

     

<强>说明

     

要启用合并程序集,您应该应用特殊形式   属性到您的程序集。为了做到这一点,你可以使用   以下说明。

     

启用程序集合并的说明

     

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

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中打开obfuscatable项目添加新的源文件到   项目并将其命名为ObfuscationSettings.cs(对于C#)或   ObfuscationSettings.vb(适用于Visual Basic .NET)。您可能更喜欢使用   另一个名称,而不是ObfuscationSettings.cs或   ObfuscationSettings.vb使用以下内容填充ObfuscationSettings.cs   内容(C#):

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中打开obfuscatable项目添加新的源文件到   项目并将其命名为ObfuscationSettings.cs(对于C#)或   ObfuscationSettings.vb(适用于Visual Basic .NET)。您可能更喜欢使用   另一个名称,而不是ObfuscationSettings.cs或   ObfuscationSettings.vb使用以下内容填充ObfuscationSettings.cs   内容(C#):

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属性可以有一个   因此,当使用装配阴影复制时,完全意外的值   打破了预期的应用逻辑。其次,位置属性   嵌入相应的程序集时,其值为null。

     

解。请改用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");
    }
}

答案 1 :(得分:3)

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

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

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

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