summaryrefslogtreecommitdiff
path: root/ext/com_dotnet/com_dotnet.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/com_dotnet/com_dotnet.c')
-rw-r--r--ext/com_dotnet/com_dotnet.c44
1 files changed, 40 insertions, 4 deletions
diff --git a/ext/com_dotnet/com_dotnet.c b/ext/com_dotnet/com_dotnet.c
index 6bd492ef1d..1b0ba2220c 100644
--- a/ext/com_dotnet/com_dotnet.c
+++ b/ext/com_dotnet/com_dotnet.c
@@ -117,6 +117,44 @@ struct dotnet_runtime_stuff {
DISPID create_instance;
};
+/* We link dynamically to mscoree.dll to avoid the hard dependency on .NET
+ * framework, which is only required if a dotnet instance is to be created.
+ */
+static HRESULT dotnet_bind_runtime(LPVOID FAR *ppv)
+{
+ HRESULT hr;
+ HMODULE mscoree;
+ typedef HRESULT (STDAPICALLTYPE *cbtr_t)(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor, REFCLSID rclsid, REFIID riid, LPVOID FAR *ppv);
+ cbtr_t CorBindToRuntime;
+ OLECHAR *oleversion;
+ char *version;
+
+ mscoree = LoadLibraryA("mscoree.dll");
+ if (mscoree == NULL) {
+ return S_FALSE;
+ }
+
+ CorBindToRuntime = (cbtr_t) GetProcAddress(mscoree, "CorBindToRuntime");
+ if (CorBindToRuntime == NULL) {
+ FreeLibrary(mscoree);
+ return S_FALSE;
+ }
+
+ version = INI_STR("com.dotnet_version");
+ if (version == NULL || *version == '\0') {
+ oleversion = NULL;
+ } else {
+ oleversion = php_com_string_to_olestring(version, strlen(version), COMG(code_page));
+ }
+
+ hr = CorBindToRuntime(oleversion, NULL, &CLSID_CorRuntimeHost, &IID_ICorRuntimeHost, ppv);
+
+ efree(oleversion);
+ FreeLibrary(mscoree);
+
+ return hr;
+}
+
static HRESULT dotnet_init(char **p_where)
{
HRESULT hr;
@@ -130,10 +168,8 @@ static HRESULT dotnet_init(char **p_where)
}
memset(stuff, 0, sizeof(*stuff));
- where = "CoCreateInstance";
- hr = CoCreateInstance(&CLSID_CorRuntimeHost, NULL, CLSCTX_ALL,
- &IID_ICorRuntimeHost, (LPVOID*)&stuff->dotnet_host);
-
+ where = "dotnet_bind_runtime";
+ hr = dotnet_bind_runtime((LPVOID*)&stuff->dotnet_host);
if (FAILED(hr))
goto out;