Инъекция управляемой DLL into.net 4.0 применение
Я успешно ввел управляемые DLL в приложение .net 3.5 с помощью библиотеки dll загрузчика (в c++), а затем мою "полезную нагрузку" dll в (c#).
Когда я пытаюсь сделать это с приложением .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);
2 ответа:
Интерфейсы изменились с .NET 4.0. Вместо использования
CorBindToRuntimeEx
Вы должны использовать новыйICLRMetaHost
интерфейс .Код может выглядеть примерно следующим образом (без проверки ошибок):
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();
Я вижу несколько "вывертов" с вашим кодом, например
CorBindToRuntimeEx
согласно МС рекомендуется .Сеть 4 .Среда выполнения .NET 4 впервые предоставляет возможность загружать несколько версий среды выполнения параллельно в один и тот же процесс, поэтому я подозреваю, что MS пришлось внести некоторые изменения esp. к хостингу CLR, чтобы это произошло...
Вы можете найти рекомендуемые новые интерфейсыздесь .