[rdnzl-cvs] r7 - in trunk/rdnzl-cpp: . RDNZL

eweitz at common-lisp.net eweitz at common-lisp.net
Wed Apr 30 08:30:07 UTC 2008


Author: eweitz
Date: Wed Apr 30 04:30:03 2008
New Revision: 7

Added:
   trunk/rdnzl-cpp/CHANGELOG.txt   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/
   trunk/rdnzl-cpp/RDNZL.sln   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/AssemblyInfo.cpp   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/DelegateAdapter.cpp   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/DelegateAdapter.h   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/DelegateAdapterBuilder.cpp   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/DelegateAdapterBuilder.h   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/DotNetContainer.cpp   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/DotNetContainer.h   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/DotNetReference.cpp   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/DotNetReference.h   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/Field.cpp   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/Field.h   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/InvocationResult.cpp   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/InvocationResult.h   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/InvokeConstructor.cpp   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/InvokeConstructor.h   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/InvokeMember.cpp   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/InvokeMember.h   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/Property.cpp   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/Property.h   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/RDNZL.vcproj   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/Stdafx.cpp   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/Stdafx.h   (contents, props changed)
   trunk/rdnzl-cpp/RDNZL/rdnzl.def   (contents, props changed)
   trunk/rdnzl-cpp/README.txt   (contents, props changed)
Log:
Import 0.7.1


Added: trunk/rdnzl-cpp/CHANGELOG.txt
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/CHANGELOG.txt	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,52 @@
+Version 0.7.1
+2008-02-19
+Fixed nullptr check in InvokeMember.cpp (thanks to Per Arild Fiskum and Iver Odin Kvello)
+
+Version 0.7.0
+2008-02-14
+Fixed return value of the generated delegate adapters (thanks to Iver Odin Kvello and Michael Mills)
+Moved to Visual Studio 2005 (thanks to Michael Goffioul and Matthew D Swank)
+
+Version 0.6.0
+2007-05-18
+Added copyDotNetContainer (patch from Iver Odin Kvello)
+Added setDotNetContainerTypeFromContainer (patch from Iver Odin Kvello)
+
+Version 0.5.2
+2006-09-27
+Only call back into Lisp if callback pointers aren't NULL (suggested by Michael Goffioul)
+
+Version 0.5.1
+2006-09-15
+Set apartment state to STA (thanks to Michael Goffioul)
+
+Version 0.5.0
+2006-01-13
+Fix mechanism which releases delegate adapters (thanks to Dominic Robinson)
+
+Version 0.4.1
+2005-11-21
+Added missing constructor for single float (caught by Andrew Wolven)
+
+Version 0.4.0
+2005-01-03
+Added interface functions for "direct calls"
+Added ChangeType code to setDotNetContainerTypeFromString
+
+Version 0.3.1
+2004-12-23
+Fixed typo in declaration of makeDotNetContainerFromFloat
+
+Version 0.3.0
+2004-12-23
+Added better support for System.Single (thanks to Vasilis Margioulas)
+
+Version 0.2.0
+2004-12-17
+Added support for pass-by-reference handling
+Correct linker settings for release configuration
+Some cleanup in routines that throw errors
+
+Version 0.1.0
+2004-12-16
+Initial public release

Added: trunk/rdnzl-cpp/RDNZL.sln
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL.sln	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,19 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual C++ Express 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RDNZL", "RDNZL\RDNZL.vcproj", "{08A74849-5B79-4488-8F41-731C19FE3A13}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Release|Win32 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{08A74849-5B79-4488-8F41-731C19FE3A13}.Debug|Win32.ActiveCfg = Release|Win32
+		{08A74849-5B79-4488-8F41-731C19FE3A13}.Debug|Win32.Build.0 = Release|Win32
+		{08A74849-5B79-4488-8F41-731C19FE3A13}.Release|Win32.ActiveCfg = Release|Win32
+		{08A74849-5B79-4488-8F41-731C19FE3A13}.Release|Win32.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

Added: trunk/rdnzl-cpp/RDNZL/AssemblyInfo.cpp
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/AssemblyInfo.cpp	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,34 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/AssemblyInfo.cpp,v 1.11 2008/02/14 07:34:30 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "stdafx.h"
+
+[assembly:AssemblyTitleAttribute("RDNZL")];
+[assembly:AssemblyDescriptionAttribute("DLL to be used by the RDNZL library which interfaces Common Lisp to .NET")];
+[assembly:AssemblyCopyrightAttribute("(c) Dr. Edmund Weitz 2004")];
+[assembly:AssemblyVersionAttribute("0.1.0.0")];

Added: trunk/rdnzl-cpp/RDNZL/DelegateAdapter.cpp
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/DelegateAdapter.cpp	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,66 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/DelegateAdapter.cpp,v 1.20 2008/02/14 11:54:02 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "stdafx.h"
+#include "DelegateAdapter.h"
+
+// the destructor notifies Lisp that this instance is no longer used -
+// might be called from a "foreign" thread, see docs
+DelegateAdapter::~DelegateAdapter() {
+  if (release != NULL) {
+    release(indexIntoLisp);
+  }
+}
+
+// initialize the instance with an index that points back to the
+// actual Lisp closure (via a Lisp hash table)
+void DelegateAdapter::init(int index) {
+  indexIntoLisp = index;
+}
+
+// this does all the work (by calling the Lisp closure) after the
+// wrapper (build at runtime from Lisp via reflection) has marshalled
+// the delegate's arguments into an array of objects
+Object^ DelegateAdapter::invoke (cli::array<Object^> ^args) {
+  if (callback != NULL) {
+    void *ptr = callback(indexIntoLisp, new DotNetContainer(args));
+    // the Lisp closure is supposed to return a pointer to a
+    // DotNetContainer which we marshall back into the underlying object
+    return static_cast<DotNetContainer *>(ptr)->getContainerObject();
+  } else {
+    // a dummy object...
+    return gcnew Object();
+  }
+}
+
+// this static function is called once in the beginning to initialize
+// the function pointers pointing to two Lisp callbacks
+void setFunctionPointers(void *(*callback_fp)(int, void *), void (*release_fp)(int)) {
+  DelegateAdapter::callback = callback_fp;
+  DelegateAdapter::release = release_fp;
+}

Added: trunk/rdnzl-cpp/RDNZL/DelegateAdapter.h
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/DelegateAdapter.h	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,48 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/DelegateAdapter.h,v 1.13 2008/02/14 07:34:30 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#include "DotNetContainer.h"
+
+public ref class DelegateAdapter {
+ public:
+  ~DelegateAdapter();
+  void init(int index);
+  Object ^invoke (cli::array<Object^> ^args);
+  static void *(*callback)(int, void *);
+  static void (*release)(int);
+ private:
+  // the index into the Lisp hash table which holds the closures -
+  // should be a 64-bit integer in the future
+  int indexIntoLisp;
+};
+
+extern "C" {
+  __declspec(dllexport) void setFunctionPointers(void *(*callback_fp)(int, void *), void (*release_fp)(int));
+}

Added: trunk/rdnzl-cpp/RDNZL/DelegateAdapterBuilder.cpp
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/DelegateAdapterBuilder.cpp	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,137 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/DelegateAdapterBuilder.cpp,v 1.11 2008/02/14 11:54:02 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "stdafx.h"
+#include "DelegateAdapterBuilder.h"
+
+// always returns the same module builder which is cached
+ModuleBuilder ^DelegateAdapterBuilder::getModuleBuilder() {
+  if (moduleBuilder != nullptr)
+    return moduleBuilder;
+
+  // if not cached already create it once
+  AssemblyName ^assemblyName = gcnew AssemblyName();
+  assemblyName->Name = privateAssemblyName;
+  assemblyName->Version = gcnew Version("1.0.0.0");
+
+  AppDomain ^appDomain = Thread::GetDomain();
+  AssemblyBuilder ^assemblyBuilder = appDomain->DefineDynamicAssembly(
+                                                                      assemblyName,
+                                                                      AssemblyBuilderAccess::Run
+                                                                     );
+
+  moduleBuilder = assemblyBuilder->DefineDynamicModule(privateAssemblyName);
+
+  return moduleBuilder;
+}
+
+// creates a constructor for our new type
+void DelegateAdapterBuilder::generateConstructor(ILGenerator ^ilGenerator) {
+  // the simplest one possible - no arguments, just call the
+  // constructor of the base type
+  ilGenerator->Emit(OpCodes::Ldarg_0);
+  ilGenerator->Emit(OpCodes::Call, DelegateAdapter::typeid->GetConstructor(gcnew cli::array<Type^>(0)));
+  ilGenerator->Emit(OpCodes::Ret);
+}
+
+// creates the "InvokeClosure" method which calls DelegateAdapter's
+// "invoke"
+void DelegateAdapterBuilder::generateInvokeMethod(ILGenerator ^ilGenerator, Type ^returnType, cli::array<Type^> ^argTypes) {
+  int nargs = argTypes->Length;
+
+  // create a System.Object array of the same length as argTypes
+  ilGenerator->DeclareLocal(cli::array<Object^>::typeid /*__typeof(Object*[])*/);
+  ilGenerator->Emit(OpCodes::Ldc_I4, nargs);  
+  ilGenerator->Emit(OpCodes::Newarr, System::Object::typeid);
+  ilGenerator->Emit(OpCodes::Stloc_0);
+
+  // store method arguments in this array
+  for (int i = 0; i < nargs; i++) {
+    ilGenerator->Emit(OpCodes::Ldloc_0);
+    ilGenerator->Emit(OpCodes::Ldc_I4, i);
+    ilGenerator->Emit(OpCodes::Ldarg, i + 1);
+
+    Type ^argType = argTypes[i];
+    if (argType->IsValueType)
+      ilGenerator->Emit(OpCodes::Box, argType);
+    ilGenerator->Emit(OpCodes::Stelem_Ref);
+  }
+
+  // call "invoke" with this array
+  ilGenerator->Emit(OpCodes::Ldarg_0);
+  ilGenerator->Emit(OpCodes::Ldloc_0);
+  ilGenerator->Emit(OpCodes::Call,DelegateAdapter::typeid->GetMethod("invoke"));
+
+  // handle return value of "invoke"
+  if (returnType->Equals(Void::typeid))
+    ilGenerator->Emit(OpCodes::Pop);
+  else if (returnType->IsValueType)
+    ilGenerator->Emit(OpCodes::Unbox_Any, returnType);
+
+  ilGenerator->Emit(OpCodes::Ret);
+}
+
+// build a new type which derives from DelegateAdapter and is
+// responsible for Lisp callbacks with a signature as described by
+// returnType and argTypes
+Type ^DelegateAdapterBuilder::buildDelegateType (String ^typeName, Type ^returnType, cli::array<Type^> ^argTypes) {
+  TypeBuilder ^typeBuilder = getModuleBuilder()->DefineType(
+                                                            String::Concat(privateAssemblyName, ".", typeName),
+                                                            TypeAttributes::Public,
+                                                            DelegateAdapter::typeid
+                                                           );
+
+  generateConstructor(typeBuilder->DefineConstructor(
+                                                     MethodAttributes::Public,
+                                                     CallingConventions::Standard,
+                                                     gcnew cli::array<Type^>(0)
+                                                    )->GetILGenerator());
+  generateInvokeMethod(
+                       typeBuilder->DefineMethod(
+                                                 "InvokeClosure",
+                                                 MethodAttributes::Public,
+                                                 returnType,
+                                                 argTypes
+                                                )->GetILGenerator(),
+                       returnType,
+                       argTypes
+                      );
+
+  return typeBuilder->CreateType();
+}
+
+// the C interface
+__declspec(dllexport) void *buildDelegateType(const __wchar_t *typeName, void *returnType, void *argTypes) {
+  Type ^newType = DelegateAdapterBuilder::buildDelegateType(
+                                                            gcnew String(typeName),
+                                                            safe_cast<Type ^>(static_cast<DotNetContainer *>(returnType)->getContainerObject()),
+                                                            safe_cast<cli::array<Type^> ^>(static_cast<DotNetContainer *>(argTypes)->getContainerObject())
+                                                           );
+
+  return new DotNetContainer(newType);
+}

Added: trunk/rdnzl-cpp/RDNZL/DelegateAdapterBuilder.h
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/DelegateAdapterBuilder.h	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,49 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/DelegateAdapterBuilder.h,v 1.7 2008/02/14 07:34:31 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#include "stdafx.h"
+#include "DelegateAdapter.h"
+
+public ref class DelegateAdapterBuilder {
+ public:
+  static Type ^buildDelegateType (String ^typeName, Type ^returnType, cli::array<Type^> ^argTypes);
+ private:
+  static String ^privateAssemblyName = "RDNZLPrivateAssembly";
+  // cache for ModuleBuilder object
+  static ModuleBuilder ^moduleBuilder = nullptr;
+
+  static ModuleBuilder ^getModuleBuilder();
+  static void generateConstructor(ILGenerator ^ilGenerator);
+  static void generateInvokeMethod(ILGenerator ^ilGenerator, Type ^returnType, cli::array<Type^> ^argTypes);
+};
+
+extern "C" {
+  __declspec(dllexport) void *buildDelegateType(const __wchar_t *typeName, void *returnType, void *argTypes);
+}

Added: trunk/rdnzl-cpp/RDNZL/DotNetContainer.cpp
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/DotNetContainer.cpp	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,246 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/DotNetContainer.cpp,v 1.26 2008/02/14 12:13:04 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "stdafx.h"
+#include "DotNetContainer.h"
+
+// helper function for constructors - initialize both object and type
+// slot, with NULL DotNetReference if necessary
+void DotNetContainer::init(Object ^o, Type ^t) {
+  object = (o != nullptr) ? new DotNetReference(o) : new DotNetReference();
+  type = (t != nullptr) ? new DotNetReference(t) : new DotNetReference();
+}
+
+// another helper function - calls init above
+void DotNetContainer::init(Object ^o) {
+  if (o == nullptr) {
+    init(nullptr, nullptr);
+  } else {
+    // if type isn't explicitely provided, derive it from the object
+    init(o, o->GetType());
+  }
+}
+
+// constructor if type is explicitely set
+DotNetContainer::DotNetContainer(Object ^o, Type ^t) {
+  init(o, t);
+}
+
+// standard constructor
+DotNetContainer::DotNetContainer(Object ^o) {
+  init(o);
+}
+
+// the following five constructors box values types
+DotNetContainer::DotNetContainer(bool b) {
+  init(b);
+}
+
+DotNetContainer::DotNetContainer(__int32 n) {
+  init(n);
+}
+
+DotNetContainer::DotNetContainer(__int64 n) {
+  init(n);
+}
+
+DotNetContainer::DotNetContainer(float f) {
+  init(f);
+}
+
+DotNetContainer::DotNetContainer(double d) {
+  init(d);
+}
+
+DotNetContainer::DotNetContainer(__wchar_t c) {
+  init(c);
+}
+
+// this constructor converts a C string into a .NET string
+DotNetContainer::DotNetContainer(const __wchar_t *s) {
+  init(gcnew String(s));
+}
+
+// whether the stored object is NULL
+bool DotNetContainer::isNull() {
+  return (object->getObject() == nullptr);
+}
+
+Object ^DotNetContainer::getContainerObject() {
+  return object->getObject();
+}
+
+Type ^DotNetContainer::getContainerType() {
+  return safe_cast<Type ^>(type->getObject());
+}
+
+// change the value of the object slot
+void DotNetContainer::setContainerObject(Object ^o) {
+  object = new DotNetReference(o);
+}
+
+// change the value of the type slot (see CAST in Lisp code)
+void DotNetContainer::setContainerType(Type ^t) {
+  type = new DotNetReference(t);
+}
+
+DotNetContainer::~DotNetContainer() {
+  if (object) {
+    delete object;
+  }
+  if (type) {
+    delete type;
+  }
+}
+
+// make a passed-by-reference type out of the container's type (if it
+// isn't one already)
+void DotNetContainer::refContainerType() {
+  Type ^t = safe_cast<Type ^>(type->getObject());
+  if (!t->IsByRef)
+    type = new DotNetReference(t->Assembly->GetType(String::Concat(t->FullName, "&")));
+}
+
+// set the container's type to be its underlying type if it was passed
+// by reference
+void DotNetContainer::unrefContainerType() {
+  Type ^t = safe_cast<Type ^>(type->getObject());
+  if (t->IsByRef) {
+    type = new DotNetReference(t->GetElementType());
+  }
+}
+
+// most of the functions below export the public interface of the
+// DotNetContainer class to C
+
+__declspec(dllexport) bool DotNetContainerIsNull(void *ptr) {
+  return static_cast<DotNetContainer *>(ptr)->isNull();
+}
+
+// make a copy of an existing DotNetContainer
+__declspec(dllexport) void *copyDotNetContainer(void *ptr) {
+  DotNetContainer* original = static_cast<DotNetContainer *> (ptr);
+  return new DotNetContainer(original->getContainerObject(), original->getContainerType());
+}
+
+// create a "placeholder" (NULL) container which only has a type
+__declspec(dllexport) void *makeTypedNullDotNetContainer(const __wchar_t *type) {
+  return new DotNetContainer(nullptr, Type::GetType(gcnew String(type)));
+}
+
+// create a container representing a type (obtained from its name)
+__declspec(dllexport) void *makeTypeFromName(const __wchar_t *type) {
+  return new DotNetContainer(Type::GetType(gcnew String(type)), Type::typeid);
+}
+
+__declspec(dllexport) void *makeDotNetContainerFromBoolean(bool b) {
+  return new DotNetContainer(b);
+}
+
+__declspec(dllexport) void *makeDotNetContainerFromInt(int n) {
+  return new DotNetContainer(n);
+}
+
+__declspec(dllexport) void *makeDotNetContainerFromLong(const __wchar_t *s) {
+  return new DotNetContainer(Int64::Parse(gcnew String(s)));
+}
+
+__declspec(dllexport) void *makeDotNetContainerFromFloat(float d) {
+  return new DotNetContainer(d);
+}
+
+__declspec(dllexport) void *makeDotNetContainerFromDouble(double d) {
+  return new DotNetContainer(d);
+}
+
+__declspec(dllexport) void *makeDotNetContainerFromString(const __wchar_t *s) {
+  return new DotNetContainer(s);
+}
+
+__declspec(dllexport) void *makeDotNetContainerFromChar(__wchar_t c) {
+  return new DotNetContainer(c);
+}
+
+// we need to know the length to allocate storage on the Lisp side
+__declspec(dllexport) int getDotNetContainerTypeStringLength(void *ptr) {
+  return static_cast<DotNetContainer *>(ptr)->getContainerType()->FullName->Length;
+}
+
+// temporarily disable warnings here as we know that the destination is large enough
+#pragma warning(disable:4996)
+__declspec(dllexport) void getDotNetContainerTypeAsString(void *ptr, __wchar_t *s) {
+  cli::pin_ptr<const __wchar_t> temp = PtrToStringChars(static_cast<DotNetContainer *>(ptr)->getContainerType()->FullName);
+  wcscpy(s, temp);
+  #pragma warning(default:4996)
+}
+
+// we need to know the length to allocate storage on the Lisp side
+__declspec(dllexport) int getDotNetContainerObjectStringLength(void *ptr) {
+  return static_cast<DotNetContainer *>(ptr)->getContainerObject()->ToString()->Length;
+}
+
+#pragma warning(disable:4996)
+__declspec(dllexport) void getDotNetContainerObjectAsString(void *ptr, __wchar_t *s) {
+  cli::pin_ptr<const __wchar_t> temp = PtrToStringChars(static_cast<DotNetContainer *>(ptr)->getContainerObject()->ToString());
+  wcscpy(s, temp);
+  #pragma warning(disable:4996)
+}
+
+__declspec(dllexport) void refDotNetContainerType(void *ptr) {
+  static_cast<DotNetContainer *>(ptr)->refContainerType();
+}
+
+__declspec(dllexport) void unrefDotNetContainerType(void *ptr) {
+  static_cast<DotNetContainer *>(ptr)->unrefContainerType();
+}
+
+// "unboxing"
+
+__declspec(dllexport) __wchar_t getDotNetContainerCharValue(void *ptr) {
+  return *safe_cast<System::Char ^>(static_cast<DotNetContainer *>(ptr)->getContainerObject());
+}
+
+__declspec(dllexport) int getDotNetContainerIntValue(void *ptr) {
+  return *safe_cast<System::Int32 ^>(static_cast<DotNetContainer *>(ptr)->getContainerObject());
+}
+
+__declspec(dllexport) bool getDotNetContainerBooleanValue(void *ptr) {
+  return *safe_cast<System::Boolean ^>(static_cast<DotNetContainer *>(ptr)->getContainerObject());
+}
+
+__declspec(dllexport) double getDotNetContainerDoubleValue(void *ptr) {
+  return *safe_cast<System::Double ^>(static_cast<DotNetContainer *>(ptr)->getContainerObject());
+}
+
+__declspec(dllexport) float getDotNetContainerSingleValue(void *ptr) {
+  return *safe_cast<System::Single ^>(static_cast<DotNetContainer *>(ptr)->getContainerObject());
+}
+
+__declspec(dllexport) void freeDotNetContainer(void *ptr) {
+  delete static_cast<DotNetContainer *>(ptr);
+}

Added: trunk/rdnzl-cpp/RDNZL/DotNetContainer.h
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/DotNetContainer.h	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,91 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/DotNetContainer.h,v 1.21 2008/02/14 07:34:31 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#include "DotNetReference.h"
+#include "DelegateAdapter.h"
+
+class DotNetContainer {
+ public:
+  DotNetContainer(Object ^o, Type ^t);
+  DotNetContainer(Object ^o);
+  DotNetContainer(bool b);
+  DotNetContainer(__int32 n);
+  DotNetContainer(__int64 n);
+  DotNetContainer(float f);
+  DotNetContainer(double d);
+  DotNetContainer(__wchar_t c);
+  DotNetContainer(const __wchar_t *s);
+  ~DotNetContainer();
+
+  bool isNull();
+  Object ^getContainerObject();
+  Type ^getContainerType();
+  void setContainerObject(Object ^o);
+  void setContainerType(Type ^t);
+  void refContainerType();
+  void unrefContainerType();
+ private:
+  // the actual object
+  DotNetReference* object;
+  // the type of this object as seen from RDNZL
+  DotNetReference* type;
+
+  void init(Object ^o, Type ^t);
+  void init(Object ^o);
+};
+
+extern "C" {
+  __declspec(dllexport) void *makeTypeFromName(const __wchar_t *type);
+  __declspec(dllexport) void *makeTypedNullDotNetContainer(const __wchar_t *type);
+  __declspec(dllexport) void *makeDotNetContainerFromBoolean(bool b);
+  __declspec(dllexport) void *makeDotNetContainerFromInt(int n);
+  __declspec(dllexport) void *makeDotNetContainerFromLong(const __wchar_t *s);
+  __declspec(dllexport) void *makeDotNetContainerFromFloat(float d);
+  __declspec(dllexport) void *makeDotNetContainerFromDouble(double d);
+  __declspec(dllexport) void *makeDotNetContainerFromChar(__wchar_t c);
+  __declspec(dllexport) void *makeDotNetContainerFromString(const __wchar_t *s);
+  __declspec(dllexport) bool DotNetContainerIsNull(void *ptr);
+  __declspec(dllexport) int getDotNetContainerTypeStringLength(void *ptr);
+  __declspec(dllexport) void getDotNetContainerTypeAsString(void *ptr, __wchar_t *s);
+  __declspec(dllexport) int getDotNetContainerObjectStringLength(void *ptr);
+  __declspec(dllexport) void getDotNetContainerObjectAsString(void *ptr, __wchar_t *s);
+  __declspec(dllexport) int getDotNetContainerIntValue(void *ptr);
+  __declspec(dllexport) __wchar_t getDotNetContainerCharValue(void *ptr);
+  __declspec(dllexport) bool getDotNetContainerBooleanValue(void *ptr);
+  __declspec(dllexport) double getDotNetContainerDoubleValue(void *ptr);
+  __declspec(dllexport) float getDotNetContainerSingleValue(void *ptr);
+  __declspec(dllexport) void refDotNetContainerType(void *ptr);
+  __declspec(dllexport) void unrefDotNetContainerType(void *ptr);
+  __declspec(dllexport) void freeDotNetContainer(void *ptr);
+  __declspec(dllexport) void *copyDotNetContainer(void *ptr);
+ // function definition is in InvocationResult.cpp
+  __declspec(dllexport) void *setDotNetContainerTypeFromString(const __wchar_t *type, void *ptr);
+  __declspec(dllexport) void *setDotNetContainerTypeFromContainer(void *type, void *ptr);
+}

Added: trunk/rdnzl-cpp/RDNZL/DotNetReference.cpp
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/DotNetReference.cpp	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,54 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/DotNetReference.cpp,v 1.9 2008/02/14 07:34:31 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "stdafx.h"
+#include "DotNetReference.h"
+
+// if constructor is called with no arguments act as NULL object
+DotNetReference::DotNetReference() : ptr(0) {}
+
+// normal constructor
+DotNetReference::DotNetReference(Object ^o) {
+  // acquire pointer to object so it can't be reclaimed by the .NET
+  // garbage collector until explicitely freed
+  ptr = ((IntPtr) GCHandle::Alloc(o)).ToPointer();
+}
+
+// destructor
+DotNetReference::~DotNetReference() {
+  if (ptr) {
+    // give up pointer so garbage collector regains control
+    static_cast<GCHandle>((IntPtr)ptr).Free();
+  }
+}
+
+Object ^DotNetReference::getObject() {
+  // return the object the instance was initialized with
+  return ptr ? safe_cast<Object^>(static_cast<GCHandle>((IntPtr)ptr).Target) : nullptr;
+}
+

Added: trunk/rdnzl-cpp/RDNZL/DotNetReference.h
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/DotNetReference.h	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,40 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/DotNetReference.h,v 1.8 2008/02/14 07:34:31 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+class DotNetReference {
+ public:
+  DotNetReference();
+  DotNetReference(Object ^o);
+  ~DotNetReference();
+
+  Object ^getObject();
+ private:
+  void *ptr;
+};

Added: trunk/rdnzl-cpp/RDNZL/Field.cpp
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/Field.cpp	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,149 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/Field.cpp,v 1.16 2008/02/14 11:54:02 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "stdafx.h"
+#include "Field.h"
+
+// provide informative message about which field wasn't found
+void Field::throwFieldNotFoundError(Type ^type, const __wchar_t *fieldName, BindingFlags bindingAttr) {
+  throw gcnew Exception(String::Concat(
+                                       (int)(BindingFlags::Static & bindingAttr) ? "Static field not found: " : "Instance field not found: ",
+                                       type->FullName,
+                                       "->",
+                                       gcnew String(fieldName)
+                                       ));
+}
+
+// helper function to get values of static and instance fields
+void *Field::getFieldValue(Object ^o, Type ^t, const __wchar_t *fieldName, BindingFlags bindingAttr) {
+  try {
+    // find field by name and binding attributes
+    FieldInfo ^fi = t->GetField(gcnew String(fieldName), bindingAttr);
+    
+    if (fi == nullptr)
+      throwFieldNotFoundError(t, fieldName, bindingAttr);
+
+    return new InvocationResult(fi->GetValue(o), fi->FieldType);
+  } catch (TargetInvocationException ^e) {
+    return new InvocationResult(e->InnerException, true);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}
+
+// helper function to get values of static and instance fields
+void *Field::getFieldValueDirectly(void *fieldInfo, Object ^o) {
+  try {
+    FieldInfo ^fi = safe_cast<FieldInfo ^>(static_cast<DotNetContainer *>(fieldInfo)->getContainerObject());
+    return new InvocationResult(fi->GetValue(o), fi->FieldType);
+  } catch (TargetInvocationException ^e) {
+    return new InvocationResult(e->InnerException, true);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}
+
+// helper function to set values of static and instance fields
+void *Field::setFieldValue(Object ^o, Type ^t, const __wchar_t *fieldName, Object ^newValue, BindingFlags bindingAttr) {
+  try {
+    // find field by name and binding attributes
+    FieldInfo ^fi = t->GetField(gcnew String(fieldName), bindingAttr);
+
+    if (fi == nullptr)
+      throwFieldNotFoundError(t, fieldName, bindingAttr);
+
+    fi->SetValue(o, newValue);
+    return new InvocationResult();
+  } catch (TargetInvocationException ^e) {
+    return new InvocationResult(e->InnerException, true);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}
+
+// helper function to set values of static and instance fields
+void *Field::setFieldValueDirectly(void *fieldInfo, Object ^o, void *newValue) {
+  try {
+    FieldInfo ^fi = safe_cast<FieldInfo ^>(static_cast<DotNetContainer *>(fieldInfo)->getContainerObject());
+
+    fi->SetValue(o, static_cast<DotNetContainer *>(newValue)->getContainerObject());
+    return new InvocationResult();
+  } catch (TargetInvocationException ^e) {
+    return new InvocationResult(e->InnerException, true);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}
+
+// below void pointers always point to DotNetContainer objects
+
+__declspec(dllexport) void *getInstanceFieldValue(const __wchar_t *fieldName, void *target) {
+  DotNetContainer *container = static_cast<DotNetContainer *>(target);
+  Type ^t = container->getContainerType();
+  Object ^o = container->getContainerObject();
+  return Field::getFieldValue(o, t, fieldName, static_cast<BindingFlags>(BindingFlags::Instance | BindingFlags::Public));
+}
+
+__declspec(dllexport) void *getStaticFieldValue(const __wchar_t *fieldName, void *type) {
+  Type ^t = safe_cast<Type ^>(static_cast<DotNetContainer *>(type)->getContainerObject());
+  return Field::getFieldValue(nullptr, t, fieldName, static_cast<BindingFlags>(BindingFlags::Static | BindingFlags::Public));
+}
+
+__declspec(dllexport) void *setInstanceFieldValue(const __wchar_t *fieldName, void *target, void *newValue) {
+  DotNetContainer *container = static_cast<DotNetContainer *>(target);
+  Type ^t = container->getContainerType();
+  Object ^o = container->getContainerObject();
+  return Field::setFieldValue(o, t, fieldName,
+                              static_cast<DotNetContainer *>(newValue)->getContainerObject(),
+                              safe_cast<BindingFlags>(BindingFlags::Instance | BindingFlags::Public));
+}
+
+__declspec(dllexport) void *setStaticFieldValue(const __wchar_t *fieldName, void *type, void *newValue) {
+  Type ^t = safe_cast<Type ^>(static_cast<DotNetContainer *>(type)->getContainerObject());
+  return Field::setFieldValue(nullptr, t, fieldName,
+                              static_cast<DotNetContainer *>(newValue)->getContainerObject(),
+                              safe_cast<BindingFlags>(BindingFlags::Static | BindingFlags::Public));
+}
+
+__declspec(dllexport) void *getInstanceFieldValueDirectly(void *fieldInfo, void *target) {
+  Object ^o = static_cast<DotNetContainer *>(target)->getContainerObject();
+  return Field::getFieldValueDirectly(fieldInfo, o);
+}
+
+__declspec(dllexport) void *getStaticFieldValueDirectly(void *fieldInfo) {
+  return Field::getFieldValueDirectly(fieldInfo, nullptr);
+}
+
+__declspec(dllexport) void *setInstanceFieldValueDirectly(void *fieldInfo, void *target, void *newValue) {
+  Object ^o = static_cast<DotNetContainer *>(target)->getContainerObject();
+  return Field::setFieldValueDirectly(fieldInfo, o, newValue);
+}
+
+__declspec(dllexport) void *setStaticFieldValueDirectly(void *fieldInfo, void *newValue) {
+  return Field::setFieldValueDirectly(fieldInfo, nullptr, newValue);
+}

Added: trunk/rdnzl-cpp/RDNZL/Field.h
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/Field.h	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,52 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/Field.h,v 1.12 2008/02/14 07:34:31 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#include "InvocationResult.h"
+
+public ref class Field {
+ public:
+  static void *getFieldValue(Object ^o, Type ^t, const __wchar_t *fieldName, BindingFlags bindingAttr);
+  static void *getFieldValueDirectly(void *fieldInfo, Object ^o);
+  static void *setFieldValue(Object ^o, Type ^t, const __wchar_t *fieldName, Object ^newValue, BindingFlags bindingAttr);
+  static void *setFieldValueDirectly(void *fieldInfo, Object ^o, void *newValue);
+ private:
+  static void throwFieldNotFoundError(Type ^type, const __wchar_t *fieldName, BindingFlags bindingAttr);
+};
+
+extern "C" {
+  __declspec(dllexport) void *getInstanceFieldValue(const __wchar_t *fieldName, void *target);
+  __declspec(dllexport) void *getStaticFieldValue(const __wchar_t *fieldName, void *type);
+  __declspec(dllexport) void *setInstanceFieldValue(const __wchar_t *fieldName, void *target, void *newValue);
+  __declspec(dllexport) void *setStaticFieldValue(const __wchar_t *fieldName, void *type, void *newValue);
+  __declspec(dllexport) void *getInstanceFieldValueDirectly(void *fieldInfo, void *target);
+  __declspec(dllexport) void *getStaticFieldValueDirectly(void *fieldInfo);
+  __declspec(dllexport) void *setInstanceFieldValueDirectly(void *fieldInfo, void *target, void *newValue);
+  __declspec(dllexport) void *setStaticFieldValueDirectly(void *fieldInfo, void *newValue);
+}

Added: trunk/rdnzl-cpp/RDNZL/InvocationResult.cpp
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/InvocationResult.cpp	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,114 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/InvocationResult.cpp,v 1.14 2008/02/14 07:43:41 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "stdafx.h"
+#include "InvocationResult.h"
+
+// constructor for "void" results
+InvocationResult::InvocationResult() : isVoid_(true), isException_(false), result(0) {}
+
+// standard constructor
+InvocationResult::InvocationResult(Object ^o, bool excp) :
+  isVoid_(false), isException_(excp), result(new DotNetContainer(o)) {}
+
+// constructor for results which are explicitely typed
+InvocationResult::InvocationResult(Object ^o, Type ^t, bool excp) :
+  isVoid_(false), isException_(excp), result(new DotNetContainer(o, t)) {}
+
+bool InvocationResult::isVoid() {
+  return isVoid_;
+}
+
+bool InvocationResult::isException() {
+  return isException_;
+}
+
+DotNetContainer *InvocationResult::getResult() {
+  return result;
+}
+
+__declspec(dllexport) bool InvocationResultIsVoid(void *ptr) {
+  return static_cast<InvocationResult *>(ptr)->isVoid();
+}
+
+__declspec(dllexport) bool InvocationResultIsException(void *ptr) {
+  return static_cast<InvocationResult *>(ptr)->isException();
+}
+
+__declspec(dllexport) void *getDotNetContainerFromInvocationResult(void *ptr) {
+  // this returns a NULL pointer if the result is void
+  return static_cast<InvocationResult *>(ptr)->getResult();
+}
+
+__declspec(dllexport) void freeInvocationResult(void *ptr) {
+  delete static_cast<InvocationResult *>(ptr);
+}
+
+// helper function for setDotNetContainerTypeFromString and setDotNetContainerTypeFromContainer.
+void *setDotNetContainerType(Type ^newType, void *ptr) {
+  try {
+    DotNetContainer *container = static_cast<DotNetContainer *>(ptr);
+    Type ^oldType = container->getContainerType();
+    
+    if (oldType->IsAssignableFrom(newType)) {
+      container->setContainerType(newType);
+    } else {
+      Object ^newObject = Convert::ChangeType(container->getContainerObject(), newType);
+      container->setContainerObject(newObject);
+      container->setContainerType(newType);
+    }
+    // return void result
+    return new InvocationResult();
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}
+
+// this should actually be in DotNetContainer.cpp but couldn't be defined there
+
+// if possible, change the type of the DotNetContainer given the string name of a type that will be found in the Load context.
+__declspec(dllexport) void *setDotNetContainerTypeFromString(const __wchar_t *type, void *ptr) {
+  try {
+    // throw an exception if something happens
+    Type ^newType = Type::GetType(gcnew String(type), true);
+    return setDotNetContainerType(newType, ptr);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}
+    
+// change the type of the DotNetContainer, if possible, given a Type object.
+__declspec(dllexport) void *setDotNetContainerTypeFromContainer(void *type, void *ptr) {
+  try {
+    // throw an exception if something happens
+    Type ^newType = safe_cast<Type ^>(static_cast<DotNetContainer *>(type)->getContainerObject());
+    return setDotNetContainerType(newType, ptr);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}
\ No newline at end of file

Added: trunk/rdnzl-cpp/RDNZL/InvocationResult.h
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/InvocationResult.h	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,57 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/InvocationResult.h,v 1.10 2008/02/14 07:34:31 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#include "DotNetContainer.h"
+
+class InvocationResult {
+ public:
+  InvocationResult();
+  InvocationResult(Object ^o, bool excp = false);
+  InvocationResult(Object ^o, Type ^t, bool excp = false);
+
+  bool isVoid();
+  bool isException();
+  DotNetContainer *getResult();
+ private:
+  // whether the object represents the "result" of a method which
+  // doesn't return anything
+  bool isVoid_;
+  // whether an exception occured
+  bool isException_;
+  // the actual result, if there was one
+  DotNetContainer *result;
+};
+
+extern "C" {
+  __declspec(dllexport) bool InvocationResultIsVoid(void *ptr);
+  __declspec(dllexport) bool InvocationResultIsException(void *ptr);
+  __declspec(dllexport) void *getDotNetContainerFromInvocationResult(void *ptr);
+  __declspec(dllexport) void freeInvocationResult(void *ptr);
+}

Added: trunk/rdnzl-cpp/RDNZL/InvokeConstructor.cpp
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/InvokeConstructor.cpp	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,49 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/InvokeConstructor.cpp,v 1.11 2008/02/14 11:54:03 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "stdafx.h"
+#include "InvokeConstructor.h"
+
+// invoke the constructor of the specified type and signature, the
+// void pointers are pointers to DotNetContainer objects
+__declspec(dllexport) void* invokeConstructor(void *type, int nargs, void *args[]) {
+  cli::array<Object^> ^realArgs = gcnew cli::array<Object^>(nargs);
+  for (int i = 0; i < nargs; i++) {
+    realArgs[i] = static_cast<DotNetContainer *>(args[i])->getContainerObject();
+  }
+        
+  try {
+    Type ^t = safe_cast<Type ^>(static_cast<DotNetContainer *>(type)->getContainerObject());
+    Object ^newInstance = Activator::CreateInstance(t, realArgs);
+    return new InvocationResult(newInstance);
+  } catch (TargetInvocationException ^e) {
+    return new InvocationResult(e->InnerException, true);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}

Added: trunk/rdnzl-cpp/RDNZL/InvokeConstructor.h
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/InvokeConstructor.h	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,35 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/InvokeConstructor.h,v 1.8 2008/02/14 07:34:31 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#include "InvocationResult.h"
+
+extern "C" {
+  __declspec(dllexport) void* invokeConstructor(void *type, int nargs, void *args[]);
+}

Added: trunk/rdnzl-cpp/RDNZL/InvokeMember.cpp
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/InvokeMember.cpp	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,200 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/InvokeMember.cpp,v 1.22 2008/02/19 18:40:54 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "stdafx.h"
+#include "InvokeMember.h"
+
+// helper function for findMethod - recursively descends into
+// all interfaces
+MethodInfo^ InvokeMember::findInterfaceMethod(cli::array<Type^> ^interfaces, const __wchar_t *methodName, cli::array<Type^> ^argTypes, BindingFlags bindingAttr) {
+  MethodInfo ^mi = nullptr;
+   
+  for (int i = 0; i < interfaces->Length && !mi; i++) {
+    mi = interfaces[i]->GetMethod(gcnew String(methodName), bindingAttr, nullptr, argTypes, nullptr);    
+    if (mi == nullptr)
+      mi = findInterfaceMethod(interfaces[i]->GetInterfaces(), methodName, argTypes, bindingAttr);
+  }
+  return mi;
+}
+
+// find method named methodName with signature as described by
+// argTypes and binding attributes bindingAttr
+MethodInfo^ InvokeMember::findMethod(Type ^type, const __wchar_t *methodName, cli::array<Type^> ^argTypes, BindingFlags bindingAttr) {
+  // first try it directly
+  MethodInfo ^mi = type->GetMethod(gcnew String(methodName), bindingAttr, nullptr, argTypes, nullptr);
+  
+  // then try for all interfaces
+  if (mi == nullptr && type->IsInterface) {
+    mi = findInterfaceMethod(type->GetInterfaces(), methodName, argTypes, bindingAttr);
+    
+    // finally (still not found) check if its a method inherited from
+    // System.Object
+    if (mi == nullptr)
+      mi = findMethod(Object::typeid, methodName, argTypes, bindingAttr);
+  }
+  return mi;
+}
+
+// provide informative message about which method wasn't found
+void InvokeMember::throwMethodNotFoundError(Type ^type, const __wchar_t *methodName, cli::array<Type^> ^argTypes, BindingFlags bindingAttr) {
+   String ^msg = String::Concat(
+                                (int)(BindingFlags::Static & bindingAttr) ? "Static method not found: " : "Instance method not found: ",
+                                type->FullName,
+                                "::",
+                                gcnew String(methodName)
+                               );
+   msg = String::Concat(msg, "(");
+   for (int i = 0; i < argTypes->Length; i++) {
+     if (i)
+       msg = String::Concat(msg, ",");
+     msg = String::Concat(msg, argTypes[i]->FullName);
+   }
+   msg = String::Concat(msg, ")");
+   throw gcnew Exception (msg);
+}
+
+// helper function to invoke static as well as instance methods
+void* InvokeMember::invokeMethod(Object ^o, Type ^t, const __wchar_t *methodName, int nargs, void *args[], BindingFlags bindingAttr) {
+  try {
+    // first convert index arguments - nargs is the number of
+    // arguments, and args is an array of pointers to DotNetContainer
+    // objects
+    cli::array<Object^> ^realArgs = gcnew cli::array<Object^>(nargs);
+    cli::array<Type^> ^realTypes = gcnew cli::array<Type^>(nargs);
+    for (int i = 0; i < nargs; i++) {
+      DotNetContainer *c = static_cast<DotNetContainer *>(args[i]);
+      realArgs[i] = c->getContainerObject();
+      realTypes[i] = c->getContainerType();
+    }
+
+    MethodInfo ^mi = findMethod(t, methodName, realTypes, bindingAttr);
+    if (mi == nullptr)
+      throwMethodNotFoundError(t, methodName, realTypes, bindingAttr);
+
+    Object ^newInstance = mi->Invoke(o, realArgs);
+    
+    // for arguments that were pass-by-reference update the object
+    // slots of the corresponding containers
+    cli::array<ParameterInfo^> ^pi = mi->GetParameters();
+    for (int i = 0; i < nargs; i++)
+      if (pi[i]->ParameterType->IsByRef) {
+        DotNetContainer *c = static_cast<DotNetContainer *>(args[i]);
+        c->setContainerObject(realArgs[i]);
+      }
+
+    if (mi->ReturnType->Equals(Void::typeid)) {
+      // return a "void" InvocationResult object if the method doesn't
+      // return anything
+      return new InvocationResult();
+    } else {
+      return new InvocationResult(newInstance, mi->ReturnType);
+    }
+  } catch (TargetInvocationException ^e) {
+    return new InvocationResult(e->InnerException, true);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}
+
+// helper function to invoke static as well as instance methods
+void* InvokeMember::invokeMethodDirectly(void *methodInfo, int nargs, void *args[], bool staticp) {
+  try {
+    // first convert index arguments - nargs is the number of
+    // arguments, and args is an array of pointers to DotNetContainer
+    // objects
+    int offset = staticp ? 0 : 1;
+    cli::array<Object^> ^realArgs = gcnew cli::array<Object^>(nargs - offset);
+    for (int i = 0; i + offset < nargs; i++)
+      realArgs[i] = static_cast<DotNetContainer *>(args[i + offset])->getContainerObject();
+
+    Object ^o = nullptr;
+    if (!staticp)
+      o = static_cast<DotNetContainer *>(args[0])->getContainerObject();
+
+    MethodInfo ^mi = safe_cast<MethodInfo ^>(static_cast<DotNetContainer *>(methodInfo)->getContainerObject());
+
+    Object ^newInstance = mi->Invoke(o, realArgs);
+    
+    // for arguments that were pass-by-reference update the object
+    // slots of the corresponding containers
+    cli::array<ParameterInfo^> ^pi = mi->GetParameters();
+    for (int i = 0; i + offset < nargs; i++)
+      if (pi[i]->ParameterType->IsByRef) {
+        DotNetContainer *c = static_cast<DotNetContainer *>(args[i + offset]);
+        c->setContainerObject(realArgs[i]);
+      }
+
+    if (mi->ReturnType->Equals(Void::typeid)) {
+      // return a "void" InvocationResult object if the method doesn't
+      // return anything
+      return new InvocationResult();
+    } else {
+      return new InvocationResult(newInstance, mi->ReturnType);
+    }
+  } catch (TargetInvocationException ^e) {
+    return new InvocationResult(e->InnerException, true);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}
+
+// below void pointers always point to DotNetContainer objects
+
+__declspec(dllexport) void* invokeInstanceMember(const __wchar_t *methodName, void *target, int nargs, void *args[]) {
+  DotNetContainer *container = static_cast<DotNetContainer *>(target);
+  Type ^t = container->getContainerType();
+  Object ^o = container->getContainerObject();
+  return InvokeMember::invokeMethod(o, t, methodName, nargs, args, static_cast<BindingFlags>(BindingFlags::Instance | BindingFlags::Public));
+}
+
+__declspec(dllexport) void* invokeInstanceMemberDirectly(void *methodInfo, int nargs, void *args[]) {
+  return InvokeMember::invokeMethodDirectly(methodInfo, nargs, args, false);
+}
+
+__declspec(dllexport) void* invokeStaticMember(const __wchar_t *methodName, void *type, int nargs, void *args[]) {
+  Type ^t = safe_cast<Type ^>(static_cast<DotNetContainer *>(type)->getContainerObject());
+  return InvokeMember::invokeMethod(nullptr, t, methodName, nargs, args, static_cast<BindingFlags>(BindingFlags::Static | BindingFlags::Public));
+}
+
+__declspec(dllexport) void* invokeStaticMemberDirectly(void *methodInfo, int nargs, void *args[]) {
+  return InvokeMember::invokeMethodDirectly(methodInfo, nargs, args, true);
+}
+
+// not directly related, but I didn't know where to put it... :)
+// "shortcut" function used by DO-RDNZL-ARRAY (see Lisp code) -
+// returns an array element for arrays of rank 1
+__declspec(dllexport) void *getArrayElement(void *ptr, int index) {
+  try {
+    Array ^array = safe_cast<Array ^>(static_cast<DotNetContainer *>(ptr)->getContainerObject());
+    Type ^elementType = array->GetType()->GetElementType();
+
+    return new InvocationResult(array->GetValue(index), elementType);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}

Added: trunk/rdnzl-cpp/RDNZL/InvokeMember.h
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/InvokeMember.h	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,49 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/InvokeMember.h,v 1.14 2008/02/14 07:34:32 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#include "InvocationResult.h"
+
+public ref class InvokeMember {
+ public:
+  static void* invokeMethod(Object ^o, Type ^t, const __wchar_t *methodName, int nargs, void *args [], BindingFlags bindingAttr);
+  static void* invokeMethodDirectly(void *methodInfo, int nargs, void *args [], bool staticp);
+ private:
+  static MethodInfo^ findInterfaceMethod(cli::array<Type^> ^interfaces, const __wchar_t *methodName, cli::array<Type^> ^argTypes, BindingFlags bindingAttr);
+  static MethodInfo^ findMethod(Type ^type, const __wchar_t *methodName, cli::array<Type^> ^argTypes, BindingFlags bindingAttr);
+  static void throwMethodNotFoundError(Type ^type, const __wchar_t *methodName, cli::array<Type^> ^argTypes, BindingFlags bindingAttr);
+};
+
+extern "C" {
+  __declspec(dllexport) void *invokeInstanceMember(const __wchar_t *methodName, void *target, int nargs, void *args[]);
+  __declspec(dllexport) void* invokeInstanceMemberDirectly(void *methodInfo, int nargs, void *args[]);
+  __declspec(dllexport) void *invokeStaticMember(const __wchar_t *methodName, void *type, int nargs, void *args[]);
+  __declspec(dllexport) void* invokeStaticMemberDirectly(void *methodInfo, int nargs, void *args[]);
+  __declspec(dllexport) void *getArrayElement(void *ptr, int index);
+}

Added: trunk/rdnzl-cpp/RDNZL/Property.cpp
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/Property.cpp	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,195 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/Property.cpp,v 1.17 2008/02/14 11:54:03 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "stdafx.h"
+#include "Property.h"
+
+// provide informative message about which property wasn't found
+void Property::throwPropertyNotFoundError(Type ^type, const __wchar_t *propertyName, cli::array<Type^> ^argTypes, BindingFlags bindingAttr) {
+   String ^msg = String::Concat(
+                                (int)(BindingFlags::Static & bindingAttr) ? "Static property not found: " : "Instance property not found: ",
+                                type->FullName,
+                                "->",
+                                gcnew String(propertyName)
+                               );
+   for (int i = 0; i < argTypes->Length; i++)
+     msg = String::Concat(msg, "[", argTypes[i]->FullName, "]");
+   throw gcnew Exception (msg);
+}
+
+// helper function to get values of static and instance properties
+void *Property::getPropertyValue(Object ^o, Type  ^t, const __wchar_t *propertyName, BindingFlags bindingAttr, int nargs, void *args[]) {
+  try {
+    // first convert index arguments - nargs is the number of
+    // arguments, and args is an array of pointers to DotNetContainer
+    // objects
+    cli::array<Object^> ^realArgs = gcnew cli::array<Object^>(nargs);
+    cli::array<Type^> ^realTypes = gcnew cli::array<Type^>(nargs);
+    for (int i = 0; i < nargs; i++) {
+      DotNetContainer *c = static_cast<DotNetContainer *>(args[i]);
+      realArgs[i] = c->getContainerObject();
+      realTypes[i] = c->getContainerType();
+    }
+
+    // find property by name, binding attributes and index signature
+    PropertyInfo ^pi = t->GetProperty(gcnew String(propertyName), bindingAttr, nullptr, nullptr, realTypes, nullptr);
+
+    if (pi == nullptr)
+      throwPropertyNotFoundError(t, propertyName, realTypes, bindingAttr);
+
+    return new InvocationResult(pi->GetValue(o, realArgs), pi->PropertyType);
+  } catch (TargetInvocationException ^e) {
+    return new InvocationResult(e->InnerException, true);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}
+
+// helper function to get values of static and instance properties
+void *Property::getPropertyValueDirectly(void *propertyInfo, int nargs, void *args[], bool staticp) {
+  try {
+    // first convert index arguments - nargs is the number of
+    // arguments, and args is an array of pointers to DotNetContainer
+    // objects
+    int offset = staticp ? 0 : 1;
+    cli::array<Object^> ^realArgs = gcnew cli::array<Object^>(nargs - offset);
+    for (int i = 0; i + offset < nargs; i++)
+      realArgs[i] = static_cast<DotNetContainer *>(args[i + offset])->getContainerObject();
+    Object ^o = nullptr;
+    if (!staticp)
+      o = static_cast<DotNetContainer *>(args[0])->getContainerObject();
+
+    PropertyInfo ^pi = safe_cast<PropertyInfo ^>(static_cast<DotNetContainer *>(propertyInfo)->getContainerObject());
+
+    return new InvocationResult(pi->GetValue(o, realArgs), pi->PropertyType);
+  } catch (TargetInvocationException ^e) {
+    return new InvocationResult(e->InnerException, true);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}
+
+// helper function to set values of static and instance properties
+void *Property::setPropertyValue(Object ^o, Type ^t, const __wchar_t *propertyName, BindingFlags bindingAttr, int nargs, void *args[]) {
+  try {
+    // first convert index arguments - nargs is the number of
+    // arguments, and args is an array of pointers to DotNetContainer
+    // objects
+    cli::array<Object^> ^realArgs = gcnew cli::array<Object^>(nargs - 1);
+    cli::array<Type^> ^realTypes = gcnew cli::array<Type^>(nargs - 1);
+    for (int i = 1; i < nargs; i++) {
+      DotNetContainer *c = static_cast<DotNetContainer *>(args[i]);
+      realArgs[i - 1] = c->getContainerObject();
+      realTypes[i - 1] = c->getContainerType();
+    }
+
+    // find property by name, binding attributes and index signature
+    PropertyInfo ^pi = t->GetProperty(gcnew String(propertyName), bindingAttr, nullptr, nullptr, realTypes, nullptr);
+
+    if (pi == nullptr)
+      throwPropertyNotFoundError(t, propertyName, realTypes, bindingAttr);
+
+    // note that the new value is the first element of args
+    pi->SetValue(o, static_cast<DotNetContainer *>(args[0])->getContainerObject(), realArgs);
+    return new InvocationResult();
+  } catch (TargetInvocationException ^e) {
+    return new InvocationResult(e->InnerException, true);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}
+
+// helper function to set values of static and instance properties
+void *Property::setPropertyValueDirectly(void *propertyInfo, int nargs, void *args[], bool staticp) {
+  try {
+    // first convert index arguments - nargs is the number of
+    // arguments, and args is an array of pointers to DotNetContainer
+    // objects
+    int offset = staticp ? 0 : 1;
+    cli::array<Object^> ^realArgs = gcnew cli::array<Object^>(nargs - 1 - offset);
+    for (int i = 1; i + offset < nargs; i++)
+      realArgs[i - 1] = static_cast<DotNetContainer *>(args[i + offset])->getContainerObject();
+
+    Object ^o = nullptr;
+    if (!staticp)
+      o = static_cast<DotNetContainer *>(args[1])->getContainerObject();
+
+    PropertyInfo ^pi = safe_cast<PropertyInfo ^>(static_cast<DotNetContainer *>(propertyInfo)->getContainerObject());
+
+    // note that the new value is the first element of args
+    pi->SetValue(o, static_cast<DotNetContainer *>(args[0])->getContainerObject(), realArgs);
+    return new InvocationResult();
+  } catch (TargetInvocationException ^e) {
+    return new InvocationResult(e->InnerException, true);
+  } catch (Exception ^e) {
+    return new InvocationResult(e, true);
+  }
+}
+
+// below void pointers always point to DotNetContainer objects
+
+__declspec(dllexport) void *getInstancePropertyValue(const __wchar_t *propertyName, void *target, int nargs, void *args[]) {
+  DotNetContainer *container = static_cast<DotNetContainer *>(target);
+  Type ^t = container->getContainerType();
+  Object ^o = container->getContainerObject();
+  return Property::getPropertyValue(o, t, propertyName, static_cast<BindingFlags>(BindingFlags::Instance | BindingFlags::Public), nargs, args);
+}
+
+__declspec(dllexport) void *getStaticPropertyValue(const __wchar_t *propertyName, void *type, int nargs, void *args[]) {
+  Type ^t = safe_cast<Type ^>(static_cast<DotNetContainer *>(type)->getContainerObject());
+  return Property::getPropertyValue(nullptr, t, propertyName, static_cast<BindingFlags>(BindingFlags::Static | BindingFlags::Public), nargs, args);
+}
+
+__declspec(dllexport) void *setInstancePropertyValue(const __wchar_t *propertyName, void *target, int nargs, void *args[]) {
+  DotNetContainer *container = static_cast<DotNetContainer *>(target);
+  Type ^t = container->getContainerType();
+  Object ^o = container->getContainerObject();
+  return Property::setPropertyValue(o, t, propertyName, static_cast<BindingFlags>(BindingFlags::Instance | BindingFlags::Public), nargs, args);
+}
+
+__declspec(dllexport) void *setStaticPropertyValue(const __wchar_t *propertyName, void *type, int nargs, void *args[]) {
+  Type ^t = safe_cast<Type ^>(static_cast<DotNetContainer *>(type)->getContainerObject());
+  return Property::setPropertyValue(nullptr, t, propertyName, static_cast<BindingFlags>(BindingFlags::Static | BindingFlags::Public), nargs, args);
+}
+
+__declspec(dllexport) void *getInstancePropertyValueDirectly(void *propertyInfo, int nargs, void *args[]) {
+  return Property::getPropertyValueDirectly(propertyInfo, nargs, args, false);
+}
+
+__declspec(dllexport) void *getStaticPropertyValueDirectly(void *propertyInfo, int nargs, void *args[]) {
+  return Property::getPropertyValueDirectly(propertyInfo, nargs, args, true);
+}
+
+__declspec(dllexport) void *setInstancePropertyValueDirectly(void *propertyInfo, int nargs, void *args[]) {
+  return Property::setPropertyValueDirectly(propertyInfo, nargs, args, false);
+}
+
+__declspec(dllexport) void *setStaticPropertyValueDirectly(void *propertyInfo, int nargs, void *args[]) {
+  return Property::setPropertyValueDirectly(propertyInfo, nargs, args, true);
+}
+

Added: trunk/rdnzl-cpp/RDNZL/Property.h
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/Property.h	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,52 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/Property.h,v 1.14 2008/02/14 07:34:32 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#include "InvocationResult.h"
+
+public ref class Property {
+ public:
+  static void *getPropertyValue(Object ^o, Type ^t, const __wchar_t *propertyName, BindingFlags bindingAttr, int nargs, void *args[]);
+  static void *setPropertyValue(Object ^o, Type ^t, const __wchar_t *propertyName, BindingFlags bindingAttr, int nargs, void *args[]);
+  static void *getPropertyValueDirectly(void *propertyInfo, int nargs, void *args[], bool staticp);
+  static void *setPropertyValueDirectly(void *propertyInfo, int nargs, void *args[], bool staticp);
+ private:
+  static void throwPropertyNotFoundError(Type ^type, const __wchar_t *propertyName, cli::array<Type^> ^argTypes, BindingFlags bindingAttr);
+};
+
+extern "C" {
+  __declspec(dllexport) void *getInstancePropertyValue(const __wchar_t *propertyName, void *target, int nargs, void *args[]);
+  __declspec(dllexport) void *setInstancePropertyValue(const __wchar_t *propertyName, void *target, int nargs, void *args[]);
+  __declspec(dllexport) void *getStaticPropertyValue(const __wchar_t *propertyName, void *type, int nargs, void *args[]);
+  __declspec(dllexport) void *setStaticPropertyValue(const __wchar_t *propertyName, void *type, int nargs, void *args[]);
+  __declspec(dllexport) void *getInstancePropertyValueDirectly(void *propertyInfo, int nargs, void *args[]);
+  __declspec(dllexport) void *getStaticPropertyValueDirectly(void *propertyInfo, int nargs, void *args[]);
+  __declspec(dllexport) void *setInstancePropertyValueDirectly(void *propertyInfo, int nargs, void *args[]);
+  __declspec(dllexport) void *setStaticPropertyValueDirectly(void *propertyInfo, int nargs, void *args[]);
+}

Added: trunk/rdnzl-cpp/RDNZL/RDNZL.vcproj
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/RDNZL.vcproj	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,304 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="8,00"
+	Name="RDNZL"
+	ProjectGUID="{08A74849-5B79-4488-8F41-731C19FE3A13}"
+	RootNamespace="RDNZL"
+	Keyword="ManagedCProj"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="Debug"
+			IntermediateDirectory="Debug"
+			ConfigurationType="2"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			CharacterSet="2"
+			ManagedExtensions="4"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG"
+				MinimalRebuild="false"
+				BasicRuntimeChecks="0"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/NOENTRY"
+				AdditionalDependencies="msvcrt.lib"
+				OutputFile="$(OutDir)/RDNZL.dll"
+				LinkIncremental="2"
+				IgnoreDefaultLibraryNames="libcmtd.lib"
+				ModuleDefinitionFile="rdnzl.def"
+				ForceSymbolReferences="__DllMainCRTStartup at 12"
+				GenerateDebugInformation="true"
+				ResourceOnlyDLL="false"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="2"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			CharacterSet="2"
+			ManagedExtensions="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="2"
+				InlineFunctionExpansion="1"
+				PreprocessorDefinitions="WIN32;NDEBUG"
+				MinimalRebuild="false"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/NOENTRY"
+				AdditionalDependencies="ptrustm.lib"
+				OutputFile="$(OutDir)/RDNZL.dll"
+				LinkIncremental="1"
+				IgnoreDefaultLibraryNames="msvcmrt.lib"
+				ModuleDefinitionFile="rdnzl.def"
+				GenerateDebugInformation="true"
+				CLRThreadAttribute="2"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"
+			>
+			<File
+				RelativePath="AssemblyInfo.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\DelegateAdapter.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\DelegateAdapterBuilder.cpp"
+				>
+			</File>
+			<File
+				RelativePath="DotNetContainer.cpp"
+				>
+			</File>
+			<File
+				RelativePath="DotNetReference.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\Field.cpp"
+				>
+			</File>
+			<File
+				RelativePath="InvocationResult.cpp"
+				>
+			</File>
+			<File
+				RelativePath="InvokeConstructor.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\InvokeMember.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\Property.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\rdnzl.def"
+				>
+			</File>
+			<File
+				RelativePath="Stdafx.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc"
+			>
+			<File
+				RelativePath=".\DelegateAdapter.h"
+				>
+			</File>
+			<File
+				RelativePath=".\DelegateAdapterBuilder.h"
+				>
+			</File>
+			<File
+				RelativePath="DotNetContainer.h"
+				>
+			</File>
+			<File
+				RelativePath="DotNetReference.h"
+				>
+			</File>
+			<File
+				RelativePath=".\Field.h"
+				>
+			</File>
+			<File
+				RelativePath="InvocationResult.h"
+				>
+			</File>
+			<File
+				RelativePath="InvokeConstructor.h"
+				>
+			</File>
+			<File
+				RelativePath=".\InvokeMember.h"
+				>
+			</File>
+			<File
+				RelativePath=".\Property.h"
+				>
+			</File>
+			<File
+				RelativePath="Stdafx.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;r"
+			>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>

Added: trunk/rdnzl-cpp/RDNZL/Stdafx.cpp
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/Stdafx.cpp	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,38 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/Stdafx.cpp,v 1.12 2008/02/14 11:54:03 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "stdafx.h"
+
+// see <http://msdn.microsoft.com/library/en-us/vcmex/html/vcconconvertingmanagedextensionsforcprojectsfrompureintermediatelanguagetomixedmode.asp?frame=true>
+
+extern "C" __declspec(dllexport) void __stdcall DllEnsureInit(void) {
+  System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
+}
+
+extern "C" __declspec(dllexport) void __stdcall DllForceTerm(void) {
+}

Added: trunk/rdnzl-cpp/RDNZL/Stdafx.h
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/Stdafx.h	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,41 @@
+// $Header: /usr/local/cvsrep/rdnzl-cpp/RDNZL/Stdafx.h,v 1.14 2008/02/14 11:54:03 edi Exp $
+//
+// Copyright (c) 2004-2008, Dr. Edmund Weitz.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//   * Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+//
+//   * Redistributions in binary form must reproduce the above
+//     copyright notice, this list of conditions and the following
+//     disclaimer in the documentation and/or other materials
+//     provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#using <mscorlib.dll>
+
+#include <string.h>
+#include <vcclr.h>
+
+using namespace System;
+using namespace System::Reflection;
+using namespace System::Reflection::Emit;
+using namespace System::Runtime::CompilerServices;
+using namespace System::Runtime::InteropServices;
+using namespace System::Threading;

Added: trunk/rdnzl-cpp/RDNZL/rdnzl.def
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/RDNZL/rdnzl.def	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,5 @@
+LIBRARY RDNZL
+
+EXPORTS
+        DllEnsureInit  PRIVATE
+        DllForceTerm   PRIVATE

Added: trunk/rdnzl-cpp/README.txt
==============================================================================
--- (empty file)
+++ trunk/rdnzl-cpp/README.txt	Wed Apr 30 04:30:03 2008
@@ -0,0 +1,6 @@
+This is the code for the "glue" library RDNZL.dll which belongs to the
+RDNZL .NET bridge for Common Lisp.
+
+This C++ source code is known to work with Microsoft Visual Studio 2005.
+
+For more info about RDNZL see <http://weitz.de/rdnzl/>.



More information about the Rdnzl-cvs mailing list