2011-09-02 13 views
6

Udało mi się wstrzyknąć zarządzane biblioteki DLL do aplikacji .net 3.5 za pomocą dll bootloadera (w języku C++), a następnie do dll "payload" (C#).Wstrzykiwanie zarządzanej biblioteki DLL do aplikacji .net 4.0

Kiedy próbuję to zrobić dla aplikacji .net 4.0 zawsze się zawiesza.

bootloadera 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(); 
    } 

Ładowność 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; 
     } 

     } 
    } 

Próbowałem za pomocą poniższego naprawić, ale bezskutecznie, jakieś pomysły? fix ??:

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

Odpowiedz

11

Interfejsy zmieniono za pomocą .NET 4.0. Zamiast używać CorBindToRuntimeEx powinieneś użyć nowego ICLRMetaHostinterface.

kod mógłby wyglądać następująco (bez błędu sprawdzania):

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

widzę kilka "dziwactwa" z kodu - na przykład CorBindToRuntimeEx jest według MS przestarzałe NET 4.

Środowisko wykonawcze .NET 4 przynosi po raz pierwszy możliwość jednoczesnego ładowania wielu wersji środowiska wykonawczego w tym samym procesie, więc podejrzewam, że MS musiało dokonać pewnych zmian, szczególnie. do hosta CLR, aby to umożliwić ...

Możesz znaleźć zalecane nowe interfejsy here.

Powiązane problemy