2011-09-02 44 views
6

Tôi đã tiêm thành công DLL được quản lý vào ứng dụng .net 3.5 bằng cách sử dụng dll bootloader (trong C++) và sau đó dll "payload" của tôi (C#).Tiêm DLL được quản lý vào .net 4.0 Ứng dụng

Khi tôi thử và thực hiện việc này với ứng dụng .net 4.0 luôn bị treo.

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

Payload 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; 
     } 

     } 
    } 

Tôi đã thử bằng cách sử dụng sửa chữa dưới đây, nhưng không có kết quả, bất kỳ ý tưởng? sửa chữa ??:

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

Trả lời

11

Giao diện đã thay đổi bằng .NET 4.0. Thay vì sử dụng CorBindToRuntimeEx, bạn nên sử dụng ICLRMetaHostinterface mới.

Mã có thể trông giống như sau (không có kiểm tra lỗi):

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

Tôi thấy một vài "tật" với mã của bạn - ví dụ CorBindToRuntimeEx là theo MS không dùng nữa trong .NET 4.

Thời gian chạy .NET 4 mang đến cho người đầu tiên khả năng tải nhiều phiên bản thời gian chạy song song vào cùng một quy trình vì vậy tôi nghi ngờ MS phải thực hiện một số thay đổi đặc biệt. để CLR lưu trữ để thực hiện điều này xảy ra ...

Bạn có thể tìm thấy Giao diện mới được đề xuất here.

Các vấn đề liên quan