代码之家  ›  专栏  ›  技术社区  ›  Meh

猴子修补-有可能吗?

  •  3
  • Meh  · 技术社区  · 16 年前

    是否可以编写一个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。

    4 回复  |  直到 16 年前
        1
  •  1
  •   TheCodeKing    16 年前

    这可以通过以下框架实现: TypeMock 它钩住了框架分析API。

    然而,这种注入通常只用于促进单元测试,而不是在生产代码中,并且会带来性能损失。我的观点是,如果你不得不在单元测试之外做一些像这样激烈的事情,那么你是否可能做了一些错误的事情。

        2
  •  1
  •   Darrel Miller    16 年前
        3
  •  0
  •   tasyjean    16 年前

    可以使用反射将此方法获取到另一个程序集中

    我不知道Ironpython,但我想这对你有帮助

    http://www.voidspace.org.uk/ironpython/dynamically_compiling.shtml

        4
  •  0
  •   Jeff Hardy    16 年前

    我不认为一旦创建了一个现有的.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不太可能允许访问字节的底层存储(除非cpython这样做),因为它不安全。

    推荐文章