2010-05-17 4 views
3

Возможно ли написать сборку C#, которая при загрузке будет вводить метод в класс из другой сборки? Если да, будет ли введенный метод доступен на языках с использованием DLR, например IronPython?C# обезьяна patching - возможно ли это?

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

Это можно сделать с помощью фреймворков, таких как TypeMock, которые подключаются к API-интерфейсам профилирования каркаса.

Однако такой тип впрыска обычно используется только для облегчения модульного тестирования, а не внутри производственного кода и имеет производительность. Мое мнение таково, что если вам нужно сделать что-то столь же радикальное, как это за пределами модульного тестирования, то разве вы, вероятно, что-то не так.

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 будет когда-либо разрешить доступ к основной памяти Bytes' (если CPython не делает) , поскольку это небезопасно.

+0

Это слишком медленно для моих нужд. Я должен построить миллионы ctypes.Structs. Я думаю, что нашел решение для инъекций, что мне нужно, используя методы расширения и GetBoundMethod. Другим решением было бы иметь метод чтения/записи объекта файла, который использует байты [] вместо байтов (что было бы безопасно). Проблема в том, что я не могу передать то, что я прочитал из файла с f.read(), в метод, реализованный в сборке C#, который использует byte [], так как это фактически получит строку. В настоящее время мне нужно перебирать каждый символ и вручную создавать байт []. У меня есть гигабайты для обработки. – Meh

+0

Я не эксперт на C#, может ли он разрешить доступ только для чтения к базовому хранилищу? Что-то вроде const void *. – Meh

+0

Да, есть ReadOnlyCollection . Я не знаю, копирует ли эти данные, хотя (надеюсь, нет). –

Смежные вопросы