【问题标题】:Using unmanaged code to check for presence of .net runtime使用非托管代码检查 .net 运行时是否存在
【发布时间】:2011-05-06 16:53:34
【问题描述】:

我想创建一个可以由 rundll32 加载的混合托管/非托管 DLL,并在尝试运行任何托管代码之前检查 .Net 运行时库的存在,因此:

using namespace System;

void SomeManagedCode()
{
    Diagnostics::Debug::WriteLine("Hello managed code!");
}

#pragma managed(push,off)

bool isRuntimeInstalled()
{
    // check for runtime using some *unmanaged* code

    return true;
}

extern "C" __declspec(dllexport) void _stdcall RunDllEntryPoint(
            HWND hWnd, HINSTANCE hInst, LPSTR lpszCmdLine, int nCmdShow)
{
    if (isRuntimeInstalled())
    {
        SomeManagedCode();
    }
    else
    {
        OutputDebugString(L".net framework not installed");
    }
}

#pragma managed(pop)

为了实现这一点,我尝试/DELAYLOAD CLR(mscoree.dll 等),以便仅在调用 SomeManagedCode() 时才加载它,而不是之前。但是,即使在调用 RunDllEntryPoint() 之前仍会加载 CLR(我可以在加载的模块列表中看到 mscoree.dll)。我相信这是因为编译器正在链接调用 _CorDllMain() 的代码,它必须在调用我自己的入口点之前强制加载运行时。

我知道有一些方法可以重新打包以使其正常工作,例如将托管代码拆分为单独的 DLL,但我很感兴趣是否有任何方法可以在单个 DLL 中制作上述工作代码。

是否可以真正延迟加载 CLR dll,如果可以,如何实现?

【问题讨论】:

    标签: dll unmanaged managed-c++ delay-load


    【解决方案1】:

    会不会是触发它的 RunDllEntryPoint 中存在函数调用“SomeManagedCode()”?它会通过添加一个间接层来解决问题吗?

    #pragma managed
    void SomeManagedCode()
    {
        Diagnostics::Debug::WriteLine("Hello managed code!");
    }
    #pragma unmanaged
    void CallSomeManagedCode()
    {
        SomeManagedCode();
    }
    extern "C" __declspec(dllexport) void _stdcall RunDllEntryPoint(
            HWND hWnd, HINSTANCE hInst, LPSTR lpszCmdLine, int nCmdShow)
    {
        if (isRuntimeInstalled())
        {
            CallSomeManagedCode();
        }
        else
        {
            OutputDebugString(L".net framework not installed");
        }
    }
    

    我处于类似的情况,试图防止 .NET 从错误的线程加载,并通过添加间接层,即从不直接从本机入口点调用任何托管代码或托管类,我能够推送.NET 加载直到稍后(在我的情况下,直到我可以从不同的线程执行它)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      相关资源
      最近更新 更多