有没有可能';条状';一个C#dll?

有没有可能';条状';一个C#dll?,c#,dll,C#,Dll,我使用模块化的方法用C#构建了一个简单的演示应用程序,它由一个可执行文件和两个DLL组成。假设我把它放在一个zip文件中并交给某人,唯一的目的是他们可以通过提取文件并双击exe来尝试演示应用程序 现在,据我所知,每个获得应用程序和DLL的人都可以在VisualStudio项目中添加对DLL的引用,然后开始使用他们拥有的任何函数/类,只要它们声明为公共的。因此,他们可以获得比我希望他们获得的多得多的信息 有没有办法禁用这个,并且得到一个类似于C++ DLL的系统(例如,我可以给任何人很多C++ D

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

现在,据我所知,每个获得应用程序和DLL的人都可以在VisualStudio项目中添加对DLL的引用,然后开始使用他们拥有的任何函数/类,只要它们声明为公共的。因此,他们可以获得比我希望他们获得的多得多的信息

有没有办法禁用这个,并且得到一个类似于C++ DLL的系统(例如,我可以给任何人很多C++ DLL,如果它们没有头文件,那么它们在使用函数/类时会有相当困难的时间)?我是否可以以某种方式剥离DLL,使它们仍然可供exe使用,但不公开引用?或者我可以在代码中使用一些属性,比如“这个类只能用于我构建的DLL/EXE”?

不,对不起,不可以


您可以对类似的内容执行ilmerge,然后再进行模糊处理(我不确定是什么工具)。

您可以使用
内部可视属性来指定
而不公开任何内容,但是

如果您认为有任何东西阻止某人使用DLL中的非公共类,那么您就错了。具有完全信任的应用程序可以毫无问题地访问私有和内部内容,也可以使用所有公共内容反编译和重建DLL

人们会建议进行模糊处理,但这并不能起到更多的作用


您应该阅读此答案(以及问题,但大部分是答案):

一种可能的解决方案是只公开应该从可执行文件调用的方法。其他一切都可以是私人的或内部的。您还可以混淆程序集。但是请记住,无论您做什么,都有可能使用反射来调用程序集中的任何方法。当然,如果它是模糊的,它会有点困难,但不是不可能的。

我想你可以用它。 您还可能混淆DLL的内部结构,因此很难进行反向工程和反编译程序集。像这样的工具会将编译后的dll中的所有函数/变量名重命名为类似a0002345的名称,因此读取它将非常详尽


请注意,没有一个方法可以为您提供100%的保护,因为仍然可以使用.NET反射例程访问和使用您的私有类和内部类。然而,将内容设置为内部或私有将阻止大多数开发人员使用这些类。使用模糊处理来阻止高级工程师试图挖掘您编译的源代码。理论上,如果反编译的工作量大于从头开始编写类似工具的工作量,那么保护就足够安全了。如果有人看不懂你的DLL,那人就不会知道如何使用它。

如果你真正的问题是“我如何用软件保护自己免受黑客攻击?”,不,你不能。你唯一能做的就是让他们的生活更艰难。看看这些技术,知道从哪里看不需要一个小时就能破解一个模糊的程序集。我不太在乎黑客:如果没有为其编写的特定硬件设备,最终的软件包将毫无用处,因此这不是许可证问题;我突然意识到,代码库的很大一部分是如此暴露,尤其是与我的C接口相比,在C接口中,人们只看到了我希望他们看到的东西,其他什么都没有。无论如何,InternalsVisibleToAttribute看起来像是一种有用的方式,使得仅仅查看创建的所有内容变得有些困难+1.