X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fdotnet%2FInvoker.h;fp=rts%2Fdotnet%2FInvoker.h;h=d649a4c7162f976787fa0e5020b6d122a45d32ad;hb=0065d5ab628975892cea1ec7303f968c3338cbe1;hp=0000000000000000000000000000000000000000;hpb=28a464a75e14cece5db40f2765a29348273ff2d2;p=ghc-hetmet.git diff --git a/rts/dotnet/Invoker.h b/rts/dotnet/Invoker.h new file mode 100644 index 0000000..d649a4c --- /dev/null +++ b/rts/dotnet/Invoker.h @@ -0,0 +1,197 @@ +// +// (c) 2003, sof. +// +// Dynamic invocation helper classes. The details of how +// to access the .NET object model via the Reflection API +// is taken care of by Invoker.{h,cpp} +// +#pragma once +#using + +using namespace System; +using namespace System::Reflection; +using namespace System::Text; +using namespace System::Runtime::InteropServices; + +[assembly:AssemblyKeyFileAttribute(S"invoker.snk")]; + +namespace DynInvoke { + +// +// Class: TypeName +// +// Purpose: pairing up an assembly name and the type/class name. +// +[ComVisible(false)] +public __gc class TypeName { + +public: + System::String* m_assembly; + System::String* m_class; + int m_length; + + TypeName() { + m_assembly = String::Empty; + m_class = String::Empty; + m_length = 0; + } + + void Print() { + if (m_assembly && m_assembly != String::Empty ) { + Console::Write("["); + Console::Write(m_assembly); + Console::Write("]"); + } + Console::WriteLine(m_class); + } + + int Length() { return m_length; } + + System::String* toStdString() { + System::String* res = new System::String(m_class->ToCharArray()); + + if (m_assembly && m_assembly != String::Empty ){ + res = String::Concat(res, S","); + res = String::Concat(res, m_assembly); + } + return res; + } +}; + +// +// Class: InvokeBridge +// +// Purpose: Collection of (static) methods for dynamically creating +// objects and accessing methods/fields on them. +// +[ClassInterface(ClassInterfaceType::AutoDual), +GuidAttribute("39D497D9-60E0-3525-B7F2-7BC096D3A2A3"), +ComVisible(true) +] +public __gc class InvokeBridge { +public: + InvokeBridge() { + Assembly* corAss = Assembly::Load("mscorlib.dll"); + System::String* dir = System::IO::Path::GetDirectoryName(corAss->Location); + + m_assemblies = new System::Collections::ArrayList(); + + System::String* fs[] = System::IO::Directory::GetFiles(dir, "*.dll"); + for (int i=0;i < fs->Length; i++) { + try { + Assembly* tAss = Assembly::LoadFrom(fs[i]); + m_assemblies->Add(tAss->FullName); + } catch (Exception* e) { + continue; + } + } + } + + // + // Method: CreateObject(String* assemName, String* objSpec, Object* args[]) + // + // Purpose: Given a fully qualified name of a class/type, try + // to create an instance of it. + // + Object* CreateObject(System::String* assemName, + System::String* objSpec, + Object* args[]); + + // + // Method: InvokeMethod + // + // Purpose: Given a pointer to an already created object, look up + // one of its method. If found, invoke the method passing it + // 'args' as arguments. + // + // Comments: the format of the method-spec is "methodName(type1,..,typeN)" [N>=0] + // + Object* InvokeMethod(Object* obj, + System::String* methSpec, + Object* args[]); + + // + // Method: InvokeStaticMethod + // + // Purpose: Invoke a static method, given the fully qualified name + // of the method (and its arguments). If found, invoke the + // method passing it 'args' as arguments. + // + // Comments: the format of the method-spec is + // "T1.T2.<..>.Tn.methodName(type1,..,typeN)" [N>=0] + // + Object* InvokeStaticMethod(System::String* assemName, + System::String* methSpec, + Object* args[]); + + // + // Method: GetField + // + // Purpose: Fetch the (boxed) value of named field of a given object. + // + Object* GetField(Object* obj, System::String* fieldSpec); + + // + // Method: GetField + // + // Purpose: Fetch the (boxed) value of named static field. + // + Object* GetStaticField(System::String* clsName, + System::String* fieldSpec); + + // + // Method: SetField + // + // Purpose: Replace the (boxed) value of named field of a given object. + // + void SetField(Object* obj, System::String* fieldSpec, Object* val); + + // + // Method: SetStaticField + // + // Purpose: Replace the (boxed) value of named field of a given object. + // + void SetStaticField(System::String* clsName, + System::String* fieldSpec, + Object* val); + + + // + // Method: NewString + // + // Purpose: construct a System.String object copy in a manner that avoids + // COM Interop from deconstructing it to a BSTR. + // + System::Object* NewString( System::String* s); + + // + // Method: NewArgArray + // + // Purpose: create a new array for holding (boxed) arguments to constructors/ + // methods. + // + Array* NewArgArray(int sz); + + // + // Method: SetArg + // + // Purpose: set an entry in the argument vector. + // + void SetArg(Object* arr[], Object* val, int idx); + + // + // Method: GetArg + // + // Purpose: get an entry in the argument vector. + // + Object* GetArg(Object* arr[], int idx); + + System::Type* InvokeBridge::GetType(System::String* typeName); + +protected: + System::Collections::ArrayList __gc* m_assemblies; + Object* InvokeBridge::CreateInstance(TypeName* typeName, + Object* args[]); +}; + +} /* namespace */