分发安全 DLL C#
Distribute secure DLL C#
我用 C# 编写了一些代码,我想将其作为 DLL 分发。我知道这方面有很多资源,但我遇到了一个奇怪的问题,而且我是 C# 的新手,因此缺乏正确搜索解决方案的词汇。
情况是:我的代码在一个 Visual Studio 项目中,而且效果很好。我可以编译它,并且在 bin 中看到 mycode.dll 文件。我相信这(连同任何其他所需的 DLL)是我需要传递给其他用户的。为了检查这一点,并确保一切正常,我创建了第二个 Visual Studio 项目来使用我创建的 DLL。
在大多数情况下,一切看起来都不错。当我在 DLL 代码中遇到运行时错误时,问题就出现了。发生这种情况时,我会看到一个描述错误的对话框,其中包含 "Break" 和 "Continue" 选项。如果我选择 "Continue",它会将我带到源代码中发生错误的位置。我不希望用户能够像这样看到我的源代码。
我已经尝试签署项目(在“属性”菜单中),但这似乎并没有解决问题,而且还会导致编译时错误,因为我正在使用的其他一些 DLL 没有签名(至少,我认为这是错误的意思)。
有没有办法将我的代码编译成不允许用户看到任何源代码的 DLL?
谢谢
这里Visual Studio试图帮助你,程序员,调试你的代码。请放心,如果您只提供 DLL,则您的源代码不会随它一起提供。 Visual Studio 能够找到它,因为它知道您的源代码在哪里。
也就是说,使用 JetBrains dotPeek 之类的工具可以轻松地将您提供的 DLL 反编译为非常接近原始源的内容。比被Visual Studio扔到源码里还要费点功夫,不过不难
DLL 的签名(强命名)与混淆无关。
当你交付一个 dot.net 程序集时,每个人都可以反编译它。
如果你混淆它,它更难反编译,但不是不可能。
签名只是保证其他项目使用您的 DLL 的一种方式,另一个 DLL 不会替换原来的。
您可以检查自己是否可以使用 reflector 反编译您的程序集。
PS :如果使用签名 DLL 的项目本身未签名,则不应抛出编译错误。抛出异常的情况相反:当您在已签名的项目中使用未签名的程序集时。
如前所述,这是 Visual Studio 试图提供帮助的案例。为确保您没有发送导致此问题的数据,请执行以下操作
- 确保您只使用
Release
配置发布构建。这本身并没有做任何事情,但确实为您提供了一种简单的方法来将行为从您的使用与外部使用分开
- 确保发布配置不会生成
PDB
(项目属性 -> 构建 -> 高级 -> 输出,调试信息)。这是允许 Visual Studio(或 Xamarin 或 Sharpdevelop...)将 运行 代码与相应的源代码片段相关联的文件 - 没有此文件会限制最终用户进行反编译。
- 混淆:技术上是一个很大的飞跃,这将使反编译代码(通过 ILSpy 或 DotPeek)变得更加困难,并且生成的代码也更加难以理解。有很多工具可以做到这一点,但它指的是让编译后的代码打乱成员和类型名称(如果你曾经打开过 Minecraft 的 JAR,你就会知道这是做什么的)
- 请注意,如果您(或您依赖的东西)使用大量反射并因此需要正确的成员名称,此步骤可能会破坏某些代码 - 请参阅 ObfuscationAttribute 以了解解决此问题的一种方法
.NET core解决了,可以把所有的dll合并成一个exe。这样用户将无法访问dll文件。
接下来他们可以反编译 exe,为此您可以进行某种安全检查或许可系统(离线或在线)来保护您的 exe。
如果你正在制作网络应用程序,你就不必担心这个问题。
我用 C# 编写了一些代码,我想将其作为 DLL 分发。我知道这方面有很多资源,但我遇到了一个奇怪的问题,而且我是 C# 的新手,因此缺乏正确搜索解决方案的词汇。
情况是:我的代码在一个 Visual Studio 项目中,而且效果很好。我可以编译它,并且在 bin 中看到 mycode.dll 文件。我相信这(连同任何其他所需的 DLL)是我需要传递给其他用户的。为了检查这一点,并确保一切正常,我创建了第二个 Visual Studio 项目来使用我创建的 DLL。
在大多数情况下,一切看起来都不错。当我在 DLL 代码中遇到运行时错误时,问题就出现了。发生这种情况时,我会看到一个描述错误的对话框,其中包含 "Break" 和 "Continue" 选项。如果我选择 "Continue",它会将我带到源代码中发生错误的位置。我不希望用户能够像这样看到我的源代码。
我已经尝试签署项目(在“属性”菜单中),但这似乎并没有解决问题,而且还会导致编译时错误,因为我正在使用的其他一些 DLL 没有签名(至少,我认为这是错误的意思)。
有没有办法将我的代码编译成不允许用户看到任何源代码的 DLL?
谢谢
这里Visual Studio试图帮助你,程序员,调试你的代码。请放心,如果您只提供 DLL,则您的源代码不会随它一起提供。 Visual Studio 能够找到它,因为它知道您的源代码在哪里。
也就是说,使用 JetBrains dotPeek 之类的工具可以轻松地将您提供的 DLL 反编译为非常接近原始源的内容。比被Visual Studio扔到源码里还要费点功夫,不过不难
DLL 的签名(强命名)与混淆无关。 当你交付一个 dot.net 程序集时,每个人都可以反编译它。 如果你混淆它,它更难反编译,但不是不可能。
签名只是保证其他项目使用您的 DLL 的一种方式,另一个 DLL 不会替换原来的。
您可以检查自己是否可以使用 reflector 反编译您的程序集。
PS :如果使用签名 DLL 的项目本身未签名,则不应抛出编译错误。抛出异常的情况相反:当您在已签名的项目中使用未签名的程序集时。
如前所述,这是 Visual Studio 试图提供帮助的案例。为确保您没有发送导致此问题的数据,请执行以下操作
- 确保您只使用
Release
配置发布构建。这本身并没有做任何事情,但确实为您提供了一种简单的方法来将行为从您的使用与外部使用分开 - 确保发布配置不会生成
PDB
(项目属性 -> 构建 -> 高级 -> 输出,调试信息)。这是允许 Visual Studio(或 Xamarin 或 Sharpdevelop...)将 运行 代码与相应的源代码片段相关联的文件 - 没有此文件会限制最终用户进行反编译。 - 混淆:技术上是一个很大的飞跃,这将使反编译代码(通过 ILSpy 或 DotPeek)变得更加困难,并且生成的代码也更加难以理解。有很多工具可以做到这一点,但它指的是让编译后的代码打乱成员和类型名称(如果你曾经打开过 Minecraft 的 JAR,你就会知道这是做什么的)
- 请注意,如果您(或您依赖的东西)使用大量反射并因此需要正确的成员名称,此步骤可能会破坏某些代码 - 请参阅 ObfuscationAttribute 以了解解决此问题的一种方法
.NET core解决了,可以把所有的dll合并成一个exe。这样用户将无法访问dll文件。
接下来他们可以反编译 exe,为此您可以进行某种安全检查或许可系统(离线或在线)来保护您的 exe。
如果你正在制作网络应用程序,你就不必担心这个问题。