C# .NET程序集.DLL加密和在团队中的使用

C# .NET程序集.DLL加密和在团队中的使用,c#,security,digital-signature,C#,Security,Digital Signature,我有一个比较大的C#项目。我想允许其他开发人员与我合作进行项目。但是我担心他们会一字不差地复制源代码。我想保护我的代码。有没有一种方法可以允许合作者使用现有的.dll,而不让他们读取源代码?或者授予他们对.dll的临时访问权限,之后当他们退出项目时,只需禁用他们使用.dll的能力?当然,您可以在不访问源代码的情况下为其他人提供dll。在像这样的大多数情况下,您会混淆dll(许多工具都可以这样做,我会从VisualStudio附带的Dotfuscator开始),因此他们无法对其进行反编译 如果您希

我有一个比较大的C#项目。我想允许其他开发人员与我合作进行项目。但是我担心他们会一字不差地复制源代码。我想保护我的代码。有没有一种方法可以允许合作者使用现有的.dll,而不让他们读取源代码?或者授予他们对.dll的临时访问权限,之后当他们退出项目时,只需禁用他们使用.dll的能力?

当然,您可以在不访问源代码的情况下为其他人提供dll。在像这样的大多数情况下,您会混淆dll(许多工具都可以这样做,我会从VisualStudio附带的Dotfuscator开始),因此他们无法对其进行反编译


如果您希望他们能够看到源代码,那么您无法避免他们复制它,就像“禁用他们使用它的能力”一样。如果他们有一份文件的副本,你无法阻止他们做什么(从技术上讲)。我能想到的唯一安全性是在执行之前让所有公共函数都检查某个服务器(这样,如果您的服务器不允许运行DLL,则DLL将变得无用),但这并不是100%,并且会给代码的最终用户带来可怕的体验。

要补充LordTakkera的答案,关于许可的部分


许可的一种变体是只允许DLL运行大约30天,DLL将检查本地时间(或点击时间服务器)以查看是否过期。然后,您可以向您的合作者提供有时间限制的DLL,并在他们留在项目中时每月使用更新的副本对其进行更新。这是较少涉及,因为它将不需要有一个许可证服务器和维护许可证密钥,以及必要的密码学,以确保有人不能伪造许可证,但也不太安全,因为时钟可以很容易地操纵,并更新每个人每月建设将是一个相当大的劝阻参与该项目。。。哦,这些权衡…

无需进行每次功能检查。您只需要在加载或第一次调用函数时执行一次。然后,您可以缓存告诉您许可证是否已验证的值。DLL如何知道是否已加载?如果每个函数都没有检查,那么使用的代码就不能调用非检查函数吗?我很想知道如何在大会上做到这一点。啊,让我澄清一下。我的意思是每个函数不需要调用许可证服务器;它需要检查本地标志以查看是否授予了许可证。所以第一个函数需要花费大量的费用进行远程调用,设置标志,所有其他函数检查标志,看是否允许运行。至于知道它正在加载的DLL,我不相信有直接的方法(与非托管方式不同,在非托管方式中可以使用
DllMain()
)。然而,对于主类型可以使用静态构造函数,如果静态构造函数抛出,那么类型就不会被加载,也不能被使用,从而有效地禁用了程序集(是的,有点黑)。感谢您的澄清,我想我们现在是一致的:)+1这是另一种“超时”dll的好方法,有提到的折衷。