All pastes #950889 Raw Edit

Anonymous

public python v1 · immutable
·published 2008-03-20 22:11 UTC
rendered paste body
from 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)