Внедрение управляемой DLL в приложение .net 4.0 - PullRequest
6 голосов
/ 02 сентября 2011

Я успешно ввел управляемые 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 ]

11 голосов
/ 02 сентября 2011

Интерфейсы изменены .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();
4 голосов
/ 02 сентября 2011

Я вижу несколько «причуд» с вашим кодом - например, CorBindToRuntimeEx в соответствии с MS устарела для .NET 4.

Среда выполнения .NET 4 впервые дает возможность загружать несколько версий среды выполнения одновременно в один и тот же процесс, поэтому я подозреваю, что MS пришлось внести некоторые изменения, особенно. на хостинг CLR, чтобы это произошло ...

Вы можете найти рекомендуемые новые интерфейсы здесь .

...