【问题标题】:What types of restrictions are in place to keep me from modifying built in types in .NET?有哪些类型的限制阻止我修改 .NET 中的内置类型?
【发布时间】:2009-07-31 19:17:58
【问题描述】:

如果我想修改某些类型以满足项目需求,对此有什么类型的限制?

我的意思是修改:

  1. 找到您感兴趣的最接近您需要的类型。
  2. 使用反光板拆卸。
  3. 根据您自己的规范对其进行修改。
  4. 在您的应用程序中使用新类型(在另一个命名空间中)。
  5. 以商业或开源形式发布您的应用。

这样做完全可以吗?

【问题讨论】:

  • 我很好奇:您能否举例说明需要修改 BCL 类型的要求?
  • 例如,如果我有一个在没有装箱/拆箱的情况下枚举为 bool 的 BitArray,我将不得不从头开始编写或修改它,这似乎不太好,所以只有 # 1 没问题。
  • 不过,没有什么能阻止您研究他们如何实现 BitArray。
  • 我认为无论如何从头开始实施它不会太难......
  • 我认为在BitArray 上的for 循环(使用它的索引器)应该是最好的选择,但我还没有测试过。为什么不写一些简单的测试看看呢? (顺便说一句,我确实在迭代器中看到了装箱/拆箱,这确实会给你带来巨大的性能损失)

标签: c# .net


【解决方案1】:

不,非常绝对不是。即使您可以这样做,它也会违反 .NET 框架许可证。您是否实际上处于合法的困境可能取决于您所在的国家/地区,但您肯定想咨询律师。

如果您打算将功能复制到 new 类型中,那么您可能必须引入大量其他内部类型和可能的其他怪异。您想要复制多少 Microsoft 代码?如果原始类型在新版本中更新等,您就会遇到问题......

只是不要这样做 - 就如何解决您遇到的任何缺陷提出一个单独的问题,但不要开始使用框架代码并将修改后的版本放入您自己的代码库中。


编辑:我原本以为 Joan 是在谈论修改代码、重建,然后替换框架中的 BCL 类。这是我对这个想法的看法......

但出于技术原因,这是一个非常糟糕的主意:

  • 您将无法再次正确签署程序集,这意味着您最多只能在完全信任的情况下运行应用程序(我不认为检查程序集签名)。
  • 您将如何部署您的新类型?您很可能必须将它部署在真实的“顶部”,这会影响使用 .NET 的其他任何人。

BCL 类型并不是为了像这样被替换而设计的。

【讨论】:

  • 谢谢乔恩。我的新类型是否在新的命名空间中是否重要?这就是我的意思,将编辑。如果不是,那么给该类型起一个新名称呢?
  • 您仍然处于非常不可靠的法律(和道德)基础上。真的,恐怕这不是首发。
  • 是的,内部类型会是个问题。我实际上想说的是,从现有类型中获取尽可能多的代码并严重/替换内部依赖项。但就像你说的那样,我认为这可能没有意义。
  • @Downvoter:否决票是因为在框架内替换类型的问题?如果是这样,那是由于误读了问题……我已经将其编辑了。如果不是,请解释我哪里出错了。
  • 嗨,乔恩,当你因为我的问题而拿到 DV 时,我很担心。无论如何我都投了赞成票。
【解决方案2】:

这样不行。您使用 Reflector 提取的代码受 Microsoft 版权保护,某些部分甚至可能获得专利。无论哪种方式,未经明确许可,您都不能将其他人的代码作为自己的代码重新分发。

可以做的是从头开始重新创建自己的实现。描述类、对象或模式的作用 不受版权保护(尽管它可能是可行的,但通常不会获得专利)。例如,您可以描述一个字符串类应该做什么,然后从头开始编写自己的类。

抛开法律影响,我很难想象从技术角度来看这是一个好主意的场景。如果您退后一步,根据您需要完成的原始事情重新构建您的问题,您可能会想出一个更好的解决方案。或者更好的是,将那个问题发布到 Stackoverflow 上,让更多人思考它。

【讨论】:

    【解决方案3】:

    使用Reflector看BCL源码技术上是already breaking the license agreement。我知道每个人(包括我自己)都会这样做,但到第 2 点时,您已经处于不稳定的状态。

    您可以通过viewing the original source code 解决此问题,但这是在Microsoft Reference Source license 下获得许可,不允许使用修改后的源代码。

    所以不,这不太行,恐怕。

    【讨论】:

    • 顺便说一句,你知道为什么 MS 不希望 ppl 从反射器中查看他们的代码,而不是混淆它吗?
    • @Joan - 他们不介意人们查看代码(从下载大部分框架源的链接中可以看出),但 .NET Framework 从 Windows 操作系统继承了其许可协议安装它的系统,这会导致奇怪的情况,查看原始源代码是合法的,但从反编译的二进制文件查看源代码是非法的!我想这只是其中之一......
    【解决方案4】:

    我不是律师,但我会说答案几乎肯定是否定的。拆卸一个封闭源代码的项目并重新发布它听起来是错误的。在执行此操作之前,您必须查看原始二进制文件的许可限制。但话又说回来,不是律师。

    解决此问题的更好方法是查看免费分发其源代码的项目。例如单声道。他们克隆大部分 BCL 并分发源代码。根据他们使用的许可规则重新分配其来源是完全合法的。我不会谈论重新分配其来源的条件(不熟悉它们),但我确信这个线程上的其他人是。

    【讨论】:

    • 那么,总体来说,Mono 的人对他们的源代码分发很酷吗?至少听起来不错。
    • @Joan,是的。根据他们的维基百科页面,Mono 的不同部分是在不同的许可证下发布的,但它们都是开源许可证 (en.wikipedia.org/wiki/Mono_(software)) 的一些变体。但再一次,我不是律师,所以不要指望我的意见。
    猜你喜欢
    • 2011-04-22
    • 2020-04-11
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2017-10-07
    相关资源
    最近更新 更多