是否有可能“剥离”C#dll?

时间:2011-10-08 15:43:51

标签: c# dll

我使用模块化方法在C#中构建了一个简单的演示应用程序,因此它包含一个可执行文件和几个dll。假设我把它放在一个zip文件中并交给某人,唯一的目的是他们可以通过提取文件并双击exe来试用演示应用程序。

现在,根据我的理解,获取应用程序和dll的每个人都可以在Visual Studio项目中添加对dll的引用,然后开始使用它们所拥有的任何函数/类,只要它们被声明为public。因此,他们可以访问的内容远远超过我希望他们访问的内容。

有没有办法禁用它,并获得一个像C ++ dll一样的系统(例如,我可以给任何人很多C ++ dll,如果使用其中的函数/类,他们将很难他们没有头文件)?我可以以某种方式剥离dll,以便它们仍可由exe使用,但不暴露引用?或者是否有属性或者我可以在代码中使用说“这个类只能用于由我构建的dlls / exes”?

4 个答案:

答案 0 :(得分:5)

您可以使用InternalsVisibleToAttribute而不公开任何内容,但是......

如果您认为有任何事情阻止某人使用您的DLL中的非公开类,那就错了。具有完全信任的应用程序可以访问私有和内部内容没有问题,或者他们可以使用所有公共反编译和重建DLL。

人们会建议混淆,但这不会做太多。

你应该阅读这个答案(和问题,但主要回答):C#: How to Make it Harder for Hacker/Cracker to Get Around or Bypass the Licensing Check?

答案 1 :(得分:3)

一种可能的解决方案是仅公开应该从可执行文件中调用的方法。其他一切都可以是私人的或内部的。您也可以对程序集进行模糊处理。但请记住,无论你做什么,总有可能使用Reflection来调用程序集中的任何方法。当然,如果它被混淆了,那将会有点困难,但并非不可能。

答案 2 :(得分:1)

我认为您可以使用Friend assemblies。 您也可以混淆 dll的内部,因此很难进行逆向工程和反编译程序集。像Dotfuscator这样的工具会将编译后的dll中的所有函数/变量名称重命名为a0002345,因此阅读它将非常详尽。

请注意,没有一种方法可以提供100%的保护,因为仍然可以使用.NET反射例程来访问和使用您的私有和内部类。但是,制作 internal private 的东西将阻止大多数开发人员使用这些类。使用模糊处理来阻止试图深入挖掘已编译源的高级工程师。理论上,如果反编译努力比从头开始编写类似工具的努力更大,则保护被认为是足够安全的。如果有人无法阅读您的dll,那么将无法知道如何使用它。

答案 3 :(得分:0)

不,对不起,不是。

您可以进行ilmerge,然后进行模糊处理(我不确定使用什么工具)。