2010-05-17 88 views
3

是否有可能编写一个C#程序集,在加载时将一个方法从另一个程序集注入到类中?如果是的话,注入的方法是否可以使用DLR的语言,如IronPython?C#猴子补丁 - 有可能吗?

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(如果可能)。

回答

1

这可以通过挂钩到框架分析API中的框架来完成,如TypeMock

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

0

我不相信这是可能延长创建一个现有的.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的一样) ,因为它不安全。

+0

这对我的需求来说太慢了。我必须构建数以百万计的ctypes.Structs。我想我找到了一个解决方案,使用扩展方法和GetBoundMethod来注入我需要的东西。另一种解决方案是使用文件对象读/写方法,它使用byte []而不是Bytes(这将是安全的)。问题是我无法将从f.read()读取的文件传递给在使用byte []的C#程序集中实现的方法,因为它实际上会接收一个字符串。目前我需要迭代每个字符并从中手动构建一个字节[]。我有千兆字节来处理。 – Meh 2010-05-18 17:30:54

+0

我不是C#专家,它是否允许对底层存储进行只读访问?类似于const void *。 – Meh 2010-05-18 17:37:11

+0

是的,有ReadOnlyCollection 。我不知道它是否复制了基础数据,尽管(我不希望)。 – 2010-05-18 21:04:52