/* * Copyright (c) 2006, 2011, Oracle and/or its affiliates. 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. * * - Neither the name of Oracle nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS 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 COPYRIGHT OWNER OR * CONTRIBUTORS 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. */ /* * This source code is provided to illustrate the usage of a given feature * or technique and has been deliberately simplified. Additional steps * required for a production-quality application, such as security checks, * input validation and proper error handling, might not be present in * this sample code. */ #define _WIN32_WINNT 0x0400 #include "windows.h" #include "Oleauto.h" #include "stdio.h" #include "mscoree.h" #include "corerror.h" #include "jni.h" #include "invokerExp.h" #include "invoker.h" #import raw_interfaces_only using namespace mscorlib; // The CLR assembly invocation function int __stdcall invokeCLR( WCHAR* wszApplication){ //Initializes the COM library CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); ICorRuntimeHost* pHost = NULL; IUnknown* pAppDomainThunk = NULL; _AppDomain* pAppDomain = NULL; long lReturn = 0; // Load CLR into the process HRESULT hr = CorBindToRuntimeEx(NULL,NULL,0,CLSID_CorRuntimeHost,IID_ICorRuntimeHost,(VOID**)&pHost); if(!FAILED(hr)) { // Start the CLR hr = pHost->Start(); if(!FAILED(hr)) { // Get the _AppDomain interface hr = pHost->GetDefaultDomain(&pAppDomainThunk); if(!FAILED(hr)) { hr = pAppDomainThunk->QueryInterface(__uuidof(_AppDomain), (void**)&pAppDomain); if(!FAILED(hr)) { // Execute assembly hr = pAppDomain->ExecuteAssembly_2(_bstr_t(wszApplication), &lReturn); if (FAILED(hr)) { printf("_AppDomain::ExecuteAssembly_2 failed with hr=0x%x.\n", hr); lReturn = -1; } }else{ printf("Can't get System::_AppDomain interface\n"); lReturn = -2; } }else{ printf("ICorRuntimeHost->GetDefaultDomain failed with hr=0x%x.\n", hr); lReturn = -3; } }else{ printf("ICorRuntimeHost->Start failed with hr=0x%x.\n", hr); lReturn = -4; } }else{ printf("CorBindToRuntimeHost failed with hr=0x%x.\n", hr); lReturn = -5; } // print the error message description if needed if(FAILED(hr)){ LPVOID lpMsgBuf = NULL; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); if(lpMsgBuf != NULL) printf("Message:%s\n",lpMsgBuf); else printf("No translation of 0x%x\n",hr); } // close COM library CoUninitialize(); return lReturn; } // Wrapper function that allows to ASCIZ string to provide the assemble path int __stdcall invokeCLR( const char* szApplication){ int nLength = strlen(szApplication)+1; WCHAR* wszApplication = new WCHAR[nLength]; mbstowcs(wszApplication, szApplication, nLength); int nReturn = invokeCLR( wszApplication); delete[] wszApplication; return nReturn; } // native method enter-point JNIEXPORT jint JNICALL Java_invoker_invokeCLR( JNIEnv* pEnv, jclass pClass, jstring jsApplication) { const char* szApplication = pEnv->GetStringUTFChars(jsApplication, NULL); int nResult = invokeCLR( szApplication); pEnv->ReleaseStringUTFChars(jsApplication,szApplication); return nResult; }