Dll 使用非托管代码检查是否存在.net运行时

Dll 使用非托管代码检查是否存在.net运行时,dll,unmanaged,managed-c++,delay-load,Dll,Unmanaged,Managed C++,Delay Load,我想创建一个混合的托管/非托管DLL,它可以由rundll32加载,并在尝试运行任何托管代码之前检查.Net运行时库的存在,因此: using namespace System; void SomeManagedCode() { Diagnostics::Debug::WriteLine("Hello managed code!"); } #pragma managed(push,off) bool isRuntimeInstalled() { // check for r

我想创建一个混合的托管/非托管DLL,它可以由rundll32加载,并在尝试运行任何托管代码之前检查.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。我相信这是因为编译器在调用_cordlmain的代码中链接,这必须在调用我自己的入口点之前强制运行时加载

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


是否有可能真正延迟加载CLR DLL?如果是,如何延迟加载?

触发它的可能是RundllentPoint中存在函数调用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加载推迟到稍后的情况,直到我可以从另一个线程执行此操作。

触发它的是RundLentPoint中存在函数调用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加载推迟到稍后的情况,直到我可以从另一个线程加载