2011-09-02 22 views
6

Başarılı bir şekilde, bir bootloader dll (C++) kullanarak bir .net 3.5 uygulamasına DLL DLL'leri enjekte ettim ve sonra da (C#) içindeki "faydalı" dll.Yönetilen DLL .net 4.0 Uygulamasına Döndürme

Bunu bir. Net 4.0 uygulamasına yapmaya çalıştığımda her zaman kilitleniyor.

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

Taşıma kapasitesi 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; 
     } 

     } 
    } 

Ben, herhangi bir fikir aşağıdaki düzeltme kullanarak çalıştı, ama boşuna mı? düzeltme ??:

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

cevap

11

Arabirimler .NET 4.0 ile değiştirildi. CorBindToRuntimeEx kullanmak yerine, yeni ICLRMetaHostinterface'u kullanmalısınız.

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(); 
:

Kod aşağıdaki (olmadan hata denetimi) gibi bir şey olabilir

4

Kuralların ile birkaç "tuhaflıklar" bakın - örneğin CorBindToRuntimeEx için MS'e göre olan .NET 4 kaldırılacaktır.

.NET 4 çalışma zamanı, birden çok çalışma zamanı sürümlerini aynı işlem içine yan yana yükleme yeteneğini getiriyor; dolayısıyla MS'nin bazı değişiklikler yapması gerektiğinden şüpheleniyorum. Bunu yapmak için CLR'ye ...

Tavsiye edilen yeni Arabirimler here'u bulabilirsiniz.