rendered paste bodyfrom System import Array, Objectfrom System.CodeDom.Compiler import CodeDomProvider, CompilerParametersclass DllWrapper(object): def __init__(self, dll): self.Dll = dll self.Functions = {} self.Type = None self.CompilerParams = CompilerParameters() self.CompilerParams.CompilerOptions = '/optimize+' self.CompilerParams.GenerateExecutable = False self.CompilerParams.GenerateInMemory = True self.CompilerParams.IncludeDebugInformation = False self.CompilerParams.ReferencedAssemblies.Add("System.dll") self.Provider = CodeDomProvider.CreateProvider("CSharp") def AddFunction(self, proto): name = proto.split('(', 1)[0].rsplit(' ', 1)[-1] self.Functions[name] = proto return self def GenCSWrapper(self): tpl = \'''using System;using System.Runtime.InteropServices;namespace DllWrapper { public class Wrapped {%s }}''' functions = [] for name, proto in self.Functions.items(): functions.append('\t\t[DllImport("%s")]' % self.Dll) functions.append('\t\tpublic static extern %s;' % proto) return self.CompileCS(tpl % '\n'.join(functions)) def CompileCS(self, code): cr = self.Provider.CompileAssemblyFromSource(self.CompilerParams, code) if cr.Errors.Count > 0: lines = code.split('\n') print '\n'.join('%04i: %s' % (i+1, lines[i]) for i in range(len(lines))) for err in cr.Errors: print err raise CPUException('Compilation failed') return cr.CompiledAssembly.GetType('DllWrapper.Wrapped') def __getattr__(self, name): if not name in self.Functions: return object.__getattr__(self, name) if self.Type == None: self.Type = self.GenCSWrapper() method = self.Type.GetMethod(name) return lambda *args: method.Invoke(None, Array[Object](args))if __name__=='__main__': wrap = DllWrapper('kernel32.dll') wrap.AddFunction('bool Beep(int freq, int dur)') wrap.Beep(5000, 100)