4

这个问题似乎已经死了,所以我决定提供赏金。

我最感兴趣的是我在下面的 ETA1 中的场景是否可行并被使用。如果不是,那么一个很好的解释为什么不是一个很好的答案。另一个很好的答案是另一种选择(但不包括 internalsvisibleto 属性)。

最好的答案是,是的,它是可行的,每个人都这样做并且客户喜欢它!

ETA2:我想我已经想到了一个很好的解决方案。我为客户提供了一个可分发的版本,它与他们的版本一样功能,但未经许可,并且使用属性隐藏了类和成员。我可以在每个重要成员上使用编译器指令来做到这一点,但我想知道是否有某种全局方法来隐藏类的所有成员?


一个简化的场景:-
我有一个以某种方式扩展控件的类,我想在两个许可证下出售我的类;

(1) 标准 - 客户获得 x 个使用我的类但无法实例化该类(其内部)的控件。
(2) 开发人员 - 与标准相同,只是他们可以创建自己的控件来使用我的类。

我的问题是,当开发人员客户来销售他们的控件时,他们会情不自禁地把我的课程暴露给他们所有的客户。

---忽略这个唯一的解决办法,在我混乱的脑海里,就是让开发人员以某种方式将我的程序集集成到他们的程序中,这样我就可以将构造函数保持在内部。或者,使用内部可见的属性。/ 忽略这个 - -

我敢肯定这里有人遇到过同样的情况,我们将不胜感激。

ETA1:我在这里大声思考,但是,我可以有一个客户可以添加的允许调用程序集名称的列表。当他们发布他们的产品时,他们的客户的程序集不会在列表中,因此他们将无法实例化某些类。(该列表显然可以散列)。

4

4 回答 4

2

我相信您会将许可信息(即标准和开发人员)存储在注册表中的某个位置。在这种情况下,我想更简单的解决方案是实现 LicenseManager。这是大多数 .NET 组件供应商使用的。

http://msdn.microsoft.com/en-us/library/fe8b1eh9.aspx

希望这可以帮助 !

于 2010-09-26T21:12:51.973 回答
1

我相信您已经提出了唯一真正的解决方案,假设运行时将支持它。只要您的 DLL 是一个单独的 DLL,如果开发人员可以实例化您的对象,那么其他任何人也可以,无论您是否尝试将其隐藏在构造函数、工厂等后面。

不过,我想知道,消费者是否甚至无法通过将发货的组件集成到他们自己的组件中来绕过这个限制?

于 2010-09-17T20:30:08.857 回答
1

为什么不使用许可证密钥?您的班级读取许可证密钥,并根据许可证提供的权限在运行时禁用方法?

许可证密钥可以在配置文件中定义。

于 2010-09-30T22:29:48.177 回答
0

这是一个艰难的,只是由于.NET 的性质。这是在黑暗中的一个镜头,但您可以查看CodeVeil等产品,它提供 IL 级别的程序集加密。您的组件基本上将被加密运输,密钥将交给您的客户。然后,客户将是唯一能够解密您的组装说明的实体。现在,CodeVeil 声称其解密密钥如下:

即使密钥存储在应用程序中,也不会使它不安全。事实上,密钥本身并不像数据本身的转换那么重要。CodeVeil 还使用许多运行时保护操作来挫败试图捕获解密程序集的黑客。此外,CodeVeil 使用了一个非常特殊的解密系统,它只解密足够的信息供 .NET 运行时执行该特定方法。代码永远不会与程序集本身存储在同一内存中,因此无法将解密的代码转储到磁盘进行分析。

这显然是一件好事,但这是您必须研究的部分,因为我不熟悉他们在解密算法中使用的其他技术。很酷的一点是,如果它有效,您的客户会很高兴,他们可以通过他们自己的 API 公开您的程序集的一部分来让他们的客户满意。同时,您的代码仍然受到 ILDASM 和 Reflector 等工具的保护。

于 2010-09-26T05:57:41.247 回答