2010-05-17 127 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