【问题标题】:C# monkey patching - is it possible?C#猴子补丁 - 有可能吗?
【发布时间】:2011-02-20 16:08:55
【问题描述】:

是否可以编写一个 C# 程序集,该程序集在加载时会将方法从另一个程序集注入到一个类中?如果是,注入的方法是否可以从使用 DLR 的语言(如 IronPython)中获得?

namespace IronPython.Runtime
{
    public class Bytes : IList<byte>, ICodeFormattable, IExpressionSerializable
    {
        internal byte[] _bytes;

        //I WANT TO INJECT THIS METHOD
        public byte[] getbytes()
        {
            return _bytes;
        }
    }
}

我需要那个方法,如果可能的话,我想避免重新编译 IronPython。

【问题讨论】:

    标签: c# ironpython dynamic-language-runtime monkeypatching


    【解决方案1】:

    这可以通过诸如TypeMock 之类的框架来完成,它与框架分析API 挂钩。

    但是,这种注入通常仅用于促进单元测试,而不是在生产代码中使用,并且会影响性​​能。我的观点是,如果你不得不在单元测试之外做一些如此激烈的事情,那么你可能做错了什么。

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      我认为现有的 .NET 类型一旦创建就不可能对其进行扩展。

      如果您只需要byte[](我猜是在 IronPython 中),您可以这样做:

      >>> import clr
      >>> import System
      >>> b = bytes([1, 2, 3, 4])
      >>> a = System.Array[bytes](b)
      >>> a
      Array[bytes]((b'\x01', b'\x02', b'\x03', b'\x04'))
      

      但是,IronPython 不太可能允许访问 Bytes 的底层存储(除非 CPython 允许),因为它不安全。

      【讨论】:

      • 这对我的需求来说太慢了。我必须构建数百万个 ctypes.Structs。我想我找到了一个解决方案,可以使用扩展方法和 GetBoundMethod 注入我需要的东西。另一种解决方案是使用 byte[] 而不是 Bytes 的文件对象读/写方法(这将是安全的)。问题是我无法将使用 f.read() 从文件中读取的内容传递给在使用 byte[] 的 C# 程序集中实现的方法,因为它实际上会接收一个字符串。目前我需要遍历每个 char 并从中手动构建一个 byte[] 。我有千兆字节要处理。
      • 我不是 C# 专家,它可以允许对底层存储进行只读访问吗?类似 const void*.
      • 是的,有 ReadOnlyCollection。不过,我不知道它是否复制了基础数据(我希望不会)。
      • 不可能从字节对象构建 ctypes.Struct 吗?还是我误会了?
      • 标准方式,使用 Struct.from_buffer_copy 在 IronPython 中不起作用(但在 CPython 中起作用)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 2012-09-16
      • 2012-12-18
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      相关资源
      最近更新 更多