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

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

最佳答案

在阅读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中打开混淆项目,将新的源文件添加到
  项目并将其命名为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中打开混淆项目,将新的源文件添加到
  项目并将其命名为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中打开混淆项目,将新的源文件添加到
  项目并将其命名为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类的location属性
  问题摘要。 System.Reflection.Assembly类的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");
    }
}

08-06 00:53
查看更多