分发安全DLL C#

时间:2015-02-13 22:11:57

标签: c# dll code-signing

我在C#中编写了一些代码,我想将它作为DLL分发。我知道这里有很多资源,但是我遇到了一个奇怪的问题,而且我是C#的新手,因此缺乏正确搜索解决方案的词汇。

情况是:我在Visual Studio项目中拥有自己的代码,而且效果很好。我可以编译它,我在bin中看到mycode.dll文件。我相信这(以及任何其他所需的DLL)是我需要传递给其他用户的东西。为了检查这一点,并确保事情按照我的要求工作,我创建了第二个Visual Studio项目来使用我创建的DLL。

在大多数情况下,一切看起来都不错。当我在DLL代码中遇到运行时错误时出现问题。当发生这种情况时,我会得到一个描述错误的对话框,其中包含“Break”和“Continue”选项。如果我选择“继续”,它会将我带到源代码中发生错误的位置。我不希望用户能够看到我的源代码。

我已尝试签署该项目(在“属性”菜单中),但这似乎无法解决问题,并且还会导致编译时错误,因为我正在使用的其他一些DLL未签名(至少,我认为这就是错误的意思)。

有没有办法将我的代码编译成DLL,不允许用户看到任何源代码?

谢谢

4 个答案:

答案 0 :(得分:4)

签名(强命名)DLL与Obfuscation无关。 当你提供一个dot.net程序集时,每个人都可以反编译它。 如果你对它进行模糊处理,那么反编译就更难了,但并非不可能。

签名只是保证使用您的DLL的其他项目的一种方式,另一个DLL不会取代原来的。

您可以自行检查是否可以使用reflector反编译程序集。

PS:如果使用签名DLL的​​项目本身未签名,则不应抛出编译错误。这是抛出异常的反过来:当你在签名项目中使用未签名的程序集时。

答案 1 :(得分:3)

这里Visual Studio正试图帮助程序员调试代码。请放心,如果您只发送DLL,则源代码不会随附。 Visual Studio能够找到它,因为它知道源代码的位置。

也就是说,您使用JetBrains dotPeek等工具可以轻松地将您发布的DLL反编译为非常靠近原始源的内容。它需要花费更多的精力,而不是被Visual Studio抛入源代码,但它并不难。

答案 2 :(得分:3)

如前所述,这是Visual Studio试图提供帮助的一个案例。为确保您不会发送导致此问题的数据,请执行以下操作

  • 确保您只使用Release配置发送构建版本。这本身没有任何作用,但它确实为您提供了一种简单的方法来将行为从您的使用分离到外部使用
  • 确保发布配置不会生成PDB(项目属性 - > build - >高级 - >输出,调试信息)。这是允许Visual Studio(或Xamarin或Sharpdevelop ...)将正在运行的代码与相应的源代码相关联的文件 - 没有此文件限制最终用户进行反编译。
  • 混淆:从技术上讲,这是一个很大的飞跃,这将使您的代码(通过ILSpy或DotPeek)的反编译变得更加困难,并且生成的代码更难以理解。有很多这方面的工具,但它指的是使编译的代码成为扰乱成员和类型名称(如果你曾经打开过Minecraft的JAR,你会知道这是做什么的)
    • 请注意,如果您(或您依赖的东西)使用大量反射并因此需要成员名称正确,此步骤可能会破坏某些代码 - 请参阅ObfuscationAttribute以了解抑制此问题的方法

答案 3 :(得分:0)

在.NET核心中,问题已解决,您可以将所有dll合并为一个exe。这样,用户将无法访问dll文件。

接下来,他们可以反编译exe,为此,您可以放置​​某种安全检查或许可系统(脱机或联机)以保护您的exe。

如果您正在制作Web应用程序,则不必担心此问题。