44const GUID IID_mscorlib_System_AppDomain = {
450x05F696DC, 0x2B29, 0x3663, {0xAD, 0x8B, 0xC4, 0x38, 0x9C, 0xF2, 0xA7, 0x13 }};
47typedef struct _Imscorlib_System_AppDomain IAppDomain;
49struct _Imscorlib_System_AppDomainVtbl {
52 HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
57 ULONG ( STDMETHODCALLTYPE *AddRef )(
60 ULONG ( STDMETHODCALLTYPE *Release )(
64#define DUMMY_METHOD(x) HRESULT ( STDMETHODCALLTYPE *dummy_##x )(IAppDomain *This)
66 DUMMY_METHOD(GetTypeInfoCount);
67 DUMMY_METHOD(GetTypeInfo);
68 DUMMY_METHOD(GetIDsOfNames);
70 DUMMY_METHOD(ToString);
72 DUMMY_METHOD(GetHashCode);
73 DUMMY_METHOD(GetType);
74 DUMMY_METHOD(InitializeLifetimeService);
75 DUMMY_METHOD(GetLifetimeService);
76 DUMMY_METHOD(Evidence);
77 DUMMY_METHOD(add_DomainUnload);
78 DUMMY_METHOD(remove_DomainUnload);
79 DUMMY_METHOD(add_AssemblyLoad);
80 DUMMY_METHOD(remove_AssemblyLoad);
81 DUMMY_METHOD(add_ProcessExit);
82 DUMMY_METHOD(remove_ProcessExit);
83 DUMMY_METHOD(add_TypeResolve);
84 DUMMY_METHOD(remove_TypeResolve);
85 DUMMY_METHOD(add_ResourceResolve);
86 DUMMY_METHOD(remove_ResourceResolve);
87 DUMMY_METHOD(add_AssemblyResolve);
88 DUMMY_METHOD(remove_AssemblyResolve);
89 DUMMY_METHOD(add_UnhandledException);
90 DUMMY_METHOD(remove_UnhandledException);
91 DUMMY_METHOD(DefineDynamicAssembly);
92 DUMMY_METHOD(DefineDynamicAssembly_2);
93 DUMMY_METHOD(DefineDynamicAssembly_3);
94 DUMMY_METHOD(DefineDynamicAssembly_4);
95 DUMMY_METHOD(DefineDynamicAssembly_5);
96 DUMMY_METHOD(DefineDynamicAssembly_6);
97 DUMMY_METHOD(DefineDynamicAssembly_7);
98 DUMMY_METHOD(DefineDynamicAssembly_8);
99 DUMMY_METHOD(DefineDynamicAssembly_9);
101 HRESULT ( STDMETHODCALLTYPE *CreateInstance )(IAppDomain * This, BSTR AssemblyName, BSTR typeName, IUnknown **pRetVal);
102 HRESULT ( STDMETHODCALLTYPE *CreateInstanceFrom )(IAppDomain * This, BSTR AssemblyFile, BSTR typeName, IUnknown **pRetVal);
109struct _Imscorlib_System_AppDomain {
110 struct _Imscorlib_System_AppDomainVtbl *lpVtbl;
115 ICorRuntimeHost *dotnet_host;
116 IAppDomain *dotnet_domain;
117 DISPID create_instance;
123static HRESULT dotnet_bind_runtime(LPVOID
FAR *ppv)
127 typedef HRESULT (STDAPICALLTYPE *cbtr_t)(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor, REFCLSID rclsid, REFIID riid, LPVOID
FAR *ppv);
128 cbtr_t CorBindToRuntime;
132 mscoree = LoadLibraryA(
"mscoree.dll");
133 if (mscoree ==
NULL) {
137 CorBindToRuntime = (cbtr_t) GetProcAddress(mscoree,
"CorBindToRuntime");
138 if (CorBindToRuntime ==
NULL) {
139 FreeLibrary(mscoree);
143 version =
INI_STR(
"com.dotnet_version");
144 if (version ==
NULL || *version ==
'\0') {
150 hr = CorBindToRuntime(oleversion,
NULL, &CLSID_CorRuntimeHost, &IID_ICorRuntimeHost, ppv);
153 FreeLibrary(mscoree);
158static HRESULT dotnet_init(
char **p_where)
162 IUnknown *unk =
NULL;
165 stuff = malloc(
sizeof(*stuff));
169 memset(stuff, 0,
sizeof(*stuff));
171 where =
"dotnet_bind_runtime";
172 hr = dotnet_bind_runtime((LPVOID*)&stuff->dotnet_host);
177 where =
"ICorRuntimeHost_Start\n";
178 hr = ICorRuntimeHost_Start(stuff->dotnet_host);
182 where =
"ICorRuntimeHost_GetDefaultDomain";
183 hr = ICorRuntimeHost_GetDefaultDomain(stuff->dotnet_host, &unk);
187 where =
"QI: System._AppDomain";
188 hr = IUnknown_QueryInterface(unk, &IID_mscorlib_System_AppDomain, (LPVOID*)&stuff->dotnet_domain);
196 IUnknown_Release(unk);
200 if (stuff->dotnet_domain) {
201 IUnknown_Release(stuff->dotnet_domain);
203 if (stuff->dotnet_host) {
204 ICorRuntimeHost_Stop(stuff->dotnet_host);
205 ICorRuntimeHost_Release(stuff->dotnet_host);
222 char *assembly_name, *datatype_name;
223 size_t assembly_name_len, datatype_name_len;
225 OLECHAR *oleassembly, *oletype;
226 BSTR oleassembly_sys, oletype_sys;
230 IUnknown *unk =
NULL;
235 &assembly_name, &assembly_name_len,
236 &datatype_name, &datatype_name_len,
244 hr = dotnet_init(&where);
248 snprintf(
buf,
sizeof(
buf),
"Failed to init .Net runtime [%s] [0x%08lx] %s", where, hr,
err);
255 }
else if (stuff->dotnet_domain ==
NULL) {
256 where =
"ICorRuntimeHost_GetDefaultDomain";
257 hr = ICorRuntimeHost_GetDefaultDomain(stuff->dotnet_host, &unk);
261 snprintf(
buf,
sizeof(
buf),
"Failed to re-init .Net domain [%s] [0x%08lx] %s", where, hr,
err);
268 where =
"QI: System._AppDomain";
269 hr = IUnknown_QueryInterface(unk, &IID_mscorlib_System_AppDomain, (LPVOID*)&stuff->dotnet_domain);
273 snprintf(
buf,
sizeof(
buf),
"Failed to re-init .Net domain [%s] [0x%08lx] %s", where, hr,
err);
292 oletype_sys = SysAllocString(oletype);
293 oleassembly_sys = SysAllocString(oleassembly);
294 where =
"CreateInstance";
295 hr = stuff->dotnet_domain->lpVtbl->CreateInstance(stuff->dotnet_domain, oleassembly_sys, oletype_sys, &unk);
298 SysFreeString(oletype_sys);
299 SysFreeString(oleassembly_sys);
305 where =
"QI: IObjectHandle";
306 hr = IUnknown_QueryInterface(unk, &IID_IObjectHandle, &
handle);
309 where =
"IObjectHandle_Unwrap";
310 hr = IObjectHandle_Unwrap(
handle, &unwrapped);
314 where =
"Unwrapped, QI for IDispatch";
315 hr = IUnknown_QueryInterface(V_UNKNOWN(&unwrapped), &IID_IDispatch, &V_DISPATCH(&obj->
v));
321 IDispatch_GetTypeInfo(V_DISPATCH(&obj->
v), 0, LANG_NEUTRAL, &obj->
typeinfo);
326 V_DISPATCH(&obj->
v) = V_DISPATCH(&unwrapped);
330 IDispatch_GetTypeInfo(V_DISPATCH(&obj->
v), 0, LANG_NEUTRAL, &obj->
typeinfo);
335 VariantClear(&unwrapped);
339 IObjectHandle_Release(
handle);
341 IUnknown_Release(unk);
347 snprintf(
buf,
sizeof(
buf),
"Failed to instantiate .Net object [%s] [0x%08lx] %s", where, hr,
err);
359 if (stuff->dotnet_domain) {
360 IDispatch_Release(stuff->dotnet_domain);
362 if (stuff->dotnet_host) {
363 ICorRuntimeHost_Stop(stuff->dotnet_host);
364 ICorRuntimeHost_Release(stuff->dotnet_host);
365 stuff->dotnet_host =
NULL;
375 if (stuff->dotnet_domain) {
376 IDispatch_Release(stuff->dotnet_domain);
377 stuff->dotnet_domain =
NULL;
PW32CP const struct php_win32_cp * php_win32_cp_get_by_id(DWORD id)
void php_com_throw_exception(HRESULT code, char *message)
PHP_COM_DOTNET_API OLECHAR * php_com_string_to_olestring(const char *string, size_t string_len, int codepage)
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
PHPAPI void php_com_initialize(void)
void * dotnet_runtime_stuff
void php_com_dotnet_rshutdown(void)
void php_com_dotnet_mshutdown(void)
struct _php_com_dotnet_object php_com_dotnet_object
PHP_WINUTIL_API char * php_win32_error_to_msg(HRESULT error)
PHP_WINUTIL_API void php_win32_error_msg_free(char *msg)
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)