summaryrefslogtreecommitdiff
path: root/ext/rpc/dotnet
diff options
context:
space:
mode:
authorSam Ruby <rubys@php.net>2000-08-26 12:53:14 +0000
committerSam Ruby <rubys@php.net>2000-08-26 12:53:14 +0000
commita0b745a0532f9f4d7c8d09c2dc2572262c56eca4 (patch)
tree5f88f5590b2579164581b492385a45d14c448e24 /ext/rpc/dotnet
parent64b8ea5963978e62a02841cc1b20e3f1265a6036 (diff)
downloadphp-git-a0b745a0532f9f4d7c8d09c2dc2572262c56eca4.tar.gz
Add ***EXPERIMENTAL*** Zend OO Extension support for Microsoft.Net
Diffstat (limited to 'ext/rpc/dotnet')
-rw-r--r--ext/rpc/dotnet/README32
-rw-r--r--ext/rpc/dotnet/dotnet.cpp243
-rw-r--r--ext/rpc/dotnet/dotnet.dsp167
-rw-r--r--ext/rpc/dotnet/dotnet.php8
-rw-r--r--ext/rpc/dotnet/php_dotnet.h21
5 files changed, 471 insertions, 0 deletions
diff --git a/ext/rpc/dotnet/README b/ext/rpc/dotnet/README
new file mode 100644
index 0000000000..8cad7bab8f
--- /dev/null
+++ b/ext/rpc/dotnet/README
@@ -0,0 +1,32 @@
+Warning
+=======
+
+This support is EXPERIMENTAL. In fact, it integrates code that
+Microsoft labels as pre-beta. Use at your own risk.
+
+Build instructions
+==================
+
+Download and install the .NET Framework SDK Technology Preview from
+http://msdn.microsoft.com/net/#sdk. Once installed, copy Mscoree.h
+(typically found in C:\Program Files\NGWSSDK\Include to ext\dotnet).
+Do not simply add the NGWSSDK\Include directory to the include path
+as this will cause compilation failures.
+
+Download and unzip the source to the dm.net COM Moniker from
+http://staff.develop.com/jasonw/clr/readme.htm. Copy mscorlib.h
+to ext\dotnet. There is no need to register the clrmonsrv.dll as
+it is not used.
+
+At this point, the dotnet project can be built like any other
+project, from either VisualStudio 6's GUI or from the command line.
+Example command line invocation:
+
+ msdev dotnet.dsp /MAKE "dotnet - Win32 Debug_TS"
+
+Execution instructions:
+=======================
+
+Add "extension=php_dotnet.dll" into php.ini.
+
+Sample program can be found at dotnet.php
diff --git a/ext/rpc/dotnet/dotnet.cpp b/ext/rpc/dotnet/dotnet.cpp
new file mode 100644
index 0000000000..7cb14df86b
--- /dev/null
+++ b/ext/rpc/dotnet/dotnet.cpp
@@ -0,0 +1,243 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP version 4.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.02 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available at through the world-wide-web at |
+ | http://www.php.net/license/2_02.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Sam Ruby <rubys@us.ibm.com> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/*
+ * This module implements support for Microsoft .Net components.
+ */
+
+#ifdef PHP_WIN32
+
+#include <iostream.h>
+#include <math.h>
+#include <comdef.h>
+
+extern "C" {
+#include "php.h"
+#include "php_ini.h"
+
+pval php_COM_get_property_handler(zend_property_reference *property_reference);
+
+
+int php_COM_set_property_handler(zend_property_reference *property_reference, pval *value);
+
+char *php_COM_error_message(HRESULT hr);
+
+void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference);
+
+int php_COM_get_le_idispatch();
+}
+
+
+#include <stdio.h>
+
+#include "Mscoree.h"
+#include "mscorlib.h"
+
+using namespace mscorlib;
+
+static ICorRuntimeHost *pHost;
+static mscorlib::_AppDomain *pDomain;
+
+static zend_class_entry dotnet_class_entry;
+
+static OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen)
+{
+ OLECHAR *unicode_str = (OLECHAR *) emalloc(sizeof(OLECHAR)*(strlen+1));
+ OLECHAR *unicode_ptr = unicode_str;
+
+ while (*C_str) {
+ *unicode_ptr++ = (unsigned short) *C_str++;
+ }
+ *unicode_ptr = 0;
+
+ return unicode_str;
+}
+
+HRESULT dotnet_init() {
+ HRESULT hr;
+
+ hr = CoCreateInstance(CLSID_CorRuntimeHost, NULL, CLSCTX_ALL,
+ IID_ICorRuntimeHost, (void **)&pHost);
+ if (FAILED(hr)) return hr;
+
+ hr = pHost->Start();
+ if (FAILED(hr)) return hr;
+
+ IUnknown *uDomain;
+ hr = pHost->GetDefaultDomain(&uDomain);
+ if (FAILED(hr)) return hr;
+
+ hr = uDomain->QueryInterface(__uuidof(_AppDomain), (void**) &pDomain);
+ if (FAILED(hr)) return -1;
+
+ uDomain->Release();
+
+ return ERROR_SUCCESS;
+}
+
+HRESULT dotnet_create(OLECHAR *assembly, OLECHAR *datatype, struct IDispatch **object) {
+ HRESULT hr;
+
+ _ObjectHandle *pHandle;
+ hr = pDomain->CreateInstance(_bstr_t(assembly), _bstr_t(datatype), &pHandle);
+ if (FAILED(hr)) return hr;
+ if (!pHandle) return hr;
+
+ _variant_t unwrapped;
+ hr = pHandle->Unwrap(&unwrapped);
+ pHandle->Release();
+ if (FAILED(hr)) return hr;
+
+ *object = unwrapped.pdispVal;
+ return ERROR_SUCCESS;
+}
+
+void dotnet_term() {
+ if (pHost) pHost->Stop();
+ if (pHost) pHost->Release();
+ if (pDomain) pDomain->Release();
+
+ pHost = 0;
+ pDomain = 0;
+}
+
+/* {{{ proto int dotnet_load(string module_name)
+ Loads a DOTNET module */
+PHP_FUNCTION(DOTNET_load)
+{
+ HRESULT hr;
+ pval *assembly_name, *datatype_name;
+ OLECHAR *assembly, *datatype;
+ IDispatch FAR *i_dispatch = NULL;
+
+ if (ZEND_NUM_ARGS() != 2) WRONG_PARAM_COUNT;
+
+ getParameters(ht, 2, &assembly_name, &datatype_name);
+ convert_to_string(assembly_name);
+ assembly = php_char_to_OLECHAR(assembly_name->value.str.val, assembly_name->value.str.len);
+
+ convert_to_string(datatype_name);
+ datatype = php_char_to_OLECHAR(datatype_name->value.str.val, datatype_name->value.str.len);
+
+ /* obtain IDispatch */
+ hr=dotnet_create(assembly, datatype, &i_dispatch);
+ efree(assembly);
+ efree(datatype);
+ if (FAILED(hr)) {
+ char *error_message;
+ error_message = php_COM_error_message(hr);
+ php_error(E_WARNING,"Error obtaining .Net class for %s in assembly %s: %s",datatype_name->value.str.val,assembly_name->value.str.val,error_message);
+ LocalFree(error_message);
+ RETURN_FALSE;
+ }
+ if (!i_dispatch) {
+ php_error(E_WARNING,"Unable to locate %s in assembly %s",datatype_name->value.str.val,assembly_name->value.str.val);
+ RETURN_FALSE;
+ }
+
+ RETURN_LONG(zend_list_insert(i_dispatch,php_COM_get_le_idispatch()));
+}
+/* }}} */
+
+
+
+void php_DOTNET_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference)
+{
+ pval *object = property_reference->object;
+ zend_overloaded_element *function_name = (zend_overloaded_element *) property_reference->elements_list->tail->data;
+
+ if (zend_llist_count(property_reference->elements_list)==1
+ && !strcmp(function_name->element.value.str.val, "dotnet")) { /* constructor */
+ pval *object_handle;
+
+ PHP_FN(DOTNET_load)(INTERNAL_FUNCTION_PARAM_PASSTHRU);
+ if (!zend_is_true(return_value)) {
+ var_reset(object);
+ return;
+ }
+ ALLOC_ZVAL(object_handle);
+ *object_handle = *return_value;
+ pval_copy_constructor(object_handle);
+ INIT_PZVAL(object_handle);
+ zend_hash_index_update(object->value.obj.properties, 0, &object_handle, sizeof(pval *), NULL);
+ pval_destructor(&function_name->element);
+ } else {
+ php_COM_call_function_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, property_reference);
+ }
+}
+
+
+void php_register_DOTNET_class()
+{
+ INIT_OVERLOADED_CLASS_ENTRY(dotnet_class_entry, "DOTNET", NULL,
+ php_DOTNET_call_function_handler,
+ php_COM_get_property_handler,
+ php_COM_set_property_handler);
+
+ zend_register_internal_class(&dotnet_class_entry);
+}
+
+function_entry DOTNET_functions[] = {
+ {NULL, NULL, NULL}
+};
+
+
+static PHP_MINFO_FUNCTION(DOTNET)
+{
+ DISPLAY_INI_ENTRIES();
+}
+
+PHP_INI_BEGIN()
+PHP_INI_END()
+
+PHP_MINIT_FUNCTION(DOTNET)
+{
+
+ HRESULT hr;
+ CoInitialize(0);
+ hr = dotnet_init();
+ if (FAILED(hr)) return hr;
+
+ php_register_DOTNET_class();
+ REGISTER_INI_ENTRIES();
+ return SUCCESS;
+}
+
+
+PHP_MSHUTDOWN_FUNCTION(DOTNET)
+{
+ dotnet_term();
+ CoUninitialize();
+ UNREGISTER_INI_ENTRIES();
+ return SUCCESS;
+}
+
+
+zend_module_entry dotnet_module_entry = {
+ "dotnet", DOTNET_functions, PHP_MINIT(DOTNET), PHP_MSHUTDOWN(DOTNET), NULL, NULL, PHP_MINFO(DOTNET), STANDARD_MODULE_PROPERTIES
+};
+
+extern "C" {
+ ZEND_GET_MODULE(dotnet)
+}
+
+void php_register_DOTNET_class();
+
+
+#endif
diff --git a/ext/rpc/dotnet/dotnet.dsp b/ext/rpc/dotnet/dotnet.dsp
new file mode 100644
index 0000000000..4243936576
--- /dev/null
+++ b/ext/rpc/dotnet/dotnet.dsp
@@ -0,0 +1,167 @@
+# Microsoft Developer Studio Project File - Name="dotnet" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=dotnet - Win32 Debug_TS
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "dotnet.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "dotnet.mak" CFG="dotnet - Win32 Debug_TS"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "dotnet - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "dotnet - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "dotnet - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "dotnet - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "dotnet - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "..\..\Release"
+# PROP BASE Intermediate_Dir "..\..\Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "..\..\Release"
+# PROP Intermediate_Dir "..\..\Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "NDEBUG" /D ZEND_DEBUG=0 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x40d /d "NDEBUG"
+# ADD RSC /l 0x40d /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\Release/php_dotnet.dll" /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Release"
+
+!ELSEIF "$(CFG)" == "dotnet - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "..\..\Debug"
+# PROP BASE Intermediate_Dir "..\..\Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "..\..\Debug"
+# PROP Intermediate_Dir "..\..\Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "_DEBUG" /D ZEND_DEBUG=1 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /FR /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x40d /d "_DEBUG"
+# ADD RSC /l 0x40d /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug/php_dotnet.dll" /pdbtype:sept /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Debug"
+
+!ELSEIF "$(CFG)" == "dotnet - Win32 Debug_TS"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "..\..\Debug_TS"
+# PROP BASE Intermediate_Dir "..\..\Debug_TS"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "..\..\Debug_TS"
+# PROP Intermediate_Dir "..\..\Debug_TS"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "_DEBUG" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /FR /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\\" /I "..\..\main" /I "..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "_DEBUG" /D ZEND_DEBUG=1 /D "ZTS" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /FR /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x40d /d "_DEBUG"
+# ADD RSC /l 0x40d /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts_debug.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS/php_dotnet.dll" /pdbtype:sept /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Debug_TS"
+
+!ELSEIF "$(CFG)" == "dotnet - Win32 Release_TS"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "..\..\Release_TS"
+# PROP BASE Intermediate_Dir "..\..\Release_TS"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "..\..\Release_TS"
+# PROP Intermediate_Dir "..\..\Release_TS"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "NDEBUG" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\\" /I "..\..\main" /I "..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "NDEBUG" /D ZEND_DEBUG=0 /D "ZTS" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x40d /d "NDEBUG"
+# ADD RSC /l 0x40d /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_dotnet.dll" /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Release_TS"
+
+!ENDIF
+
+# Begin Target
+
+# Name "dotnet - Win32 Release"
+# Name "dotnet - Win32 Debug"
+# Name "dotnet - Win32 Debug_TS"
+# Name "dotnet - Win32 Release_TS"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\dotnet.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\..\..\win32\winutil.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\php_dotnet.h
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/ext/rpc/dotnet/dotnet.php b/ext/rpc/dotnet/dotnet.php
new file mode 100644
index 0000000000..3b0b67c02f
--- /dev/null
+++ b/ext/rpc/dotnet/dotnet.php
@@ -0,0 +1,8 @@
+<?
+ $stack = new DOTNET("mscorlib","System.Collections.Stack");
+
+ $stack->Push(".Net");
+ $stack->Push("Hello ");
+
+ echo $stack->Pop() . $stack->Pop();
+?>
diff --git a/ext/rpc/dotnet/php_dotnet.h b/ext/rpc/dotnet/php_dotnet.h
new file mode 100644
index 0000000000..570f4bdc7f
--- /dev/null
+++ b/ext/rpc/dotnet/php_dotnet.h
@@ -0,0 +1,21 @@
+#ifndef PHP_DOTNET_H
+#define PHP_DOTNET_H
+
+#if WIN32|WINNT
+
+extern PHP_MINIT_FUNCTION(DOTNET);
+extern PHP_MSHUTDOWN_FUNCTION(DOTNET);
+PHP_FUNCTION(DOTNET_load);
+
+extern zend_module_entry DOTNET_module_entry;
+#define DOTNET_module_ptr &DOTNET_module_entry
+
+#else
+
+#define DOTNET_module_ptr NULL
+
+#endif /* Win32|WINNT */
+
+#define phpext_DOTNET_ptr DOTNET_module_ptr
+
+#endif /* PHP_DOTNET_H */