2011-09-02 4 views
6

bootloader dll (C++)을 사용하고 나서 "payload"dll (C#)을 사용하여 관리되는 DLL을 .net 3.5 응용 프로그램에 성공적으로 주입했습니다.관리되는 DLL을 .net 4.0 응용 프로그램에 삽입

내가하려고 할 때이. NET 4.0 응용 프로그램에 항상 충돌이 발생합니다.

부트 로더 C++ :

#include "MSCorEE.h" 

    void StartTheDotNetRuntime() 
    { 
     // Bind to the CLR runtime.. 
     ICLRRuntimeHost *pClrHost = NULL; 
     HRESULT hr = CorBindToRuntimeEx(
     NULL, L"wks", 0, CLSID_CLRRuntimeHost, 
     IID_ICLRRuntimeHost, (PVOID*)&pClrHost); 

     hr = pClrHost->Start(); 

     // Okay, the CLR is up and running in this (previously native) process. 
     // Now call a method on our managed C# class library. 
     DWORD dwRet = 0; 
     hr = pClrHost->ExecuteInDefaultAppDomain(
      L"payload.dll", 
      L"MyNamespace.MyClass", L"MyMethod", L"MyParameter", &dwRet); 

     // Optionally stop the CLR runtime (we could also leave it running) 
     hr = pClrHost->Stop(); 

     // Don't forget to clean up. 
     pClrHost->Release(); 
    } 

페이로드 C 번호 :

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms; 

    namespace MyNamespace 
    { 
     public class MyClass 
     { 
      // This method will be called by native code inside the target process... 
      public static int MyMethod(String pwzArgument) 
     { 
      MessageBox.Show("Hello World"); 
      return 0; 
     } 

     } 
    } 

나는, 어떤 아이디어를 아래의 수정을 사용했지만, 아무 소용이 있나요? 수정 ?? :

hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_ICLRRuntimeInfo, (LPVOID*)&lpRuntimeInfo); 

답변

11

인터페이스가 .NET 4.0으로 변경되었습니다. CorBindToRuntimeEx을 사용하는 대신 새로 ICLRMetaHostinterface을 사용해야합니다.

ICLRMetaHost *pMetaHost = NULL; 
CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost); 

ICLRRuntimeInfo *pRuntimeInfo = NULL; 
pMetaHost->GetRuntime(L"v4.0.30319", IID_ICLRRuntimeInfo, (LPVOID*)&pRuntimeInfo); 

ICLRRuntimeHost *pClrRuntimeHost = NULL; 
pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID*)&pClrRuntimeHost); 

pClrRuntimeHost->Start(); 
:

코드는 다음 (없는 오류 검사) 같은 것을 볼 수 있었다

4

난 당신의 코드 몇 가지 "단점"을 참조하십시오 - 예를 CorBindToRuntimeEx에 대해 MS에 따라됩니다 .NET 4되지 않습니다.

.NET 4 런타임은 다중 런타임 버전을 동일한 프로세스에 나란히로드 할 수있는 기능을 제공하므로 MS가 일부 변경해야 할 것으로 판단됩니다. 이를 실현하기 위해 CLR 호스팅에 ...

권장되는 새로운 인터페이스 here을 찾을 수 있습니다.

관련 문제