【问题标题】:0xc000007b Error - but all DLLs are 32 bit0xc000007b 错误 - 但所有 DLL 都是 32 位
【发布时间】:2023-03-11 10:11:01
【问题描述】:

我在面向 .NET Framework 3.5 的 Windows 7 32 位操作系统上使用 Visual Studio 2008 使用 /clr 选项编译我的 C++ 代码。

所有 DLL 都是 32 位的(使用 Dependency Walker 验证)。

根据我的研究,当 32 位代码调用 64 位 DLL 时会出现此错误,但此处并非如此。

还有其他导致错误 0xc000007b 的根本原因吗?

【问题讨论】:

  • 一个针对完全不同的机器架构的 DLL,比如 Itanium。你至少知道麻烦制造者 DLL 吗?查看“输出”窗口。

标签: windows visual-studio-2008 clr


【解决方案1】:

刚好解决了这个问题。 似乎这个错误不仅是由在 32 位代码中混合 64 位库引起的,而且还因为库被弄乱了——在我的例子中,我使用的是二进制 PCRE 库。

我自己使用 MingW 构建了 PCRE,现在一切正常。

【讨论】:

    【解决方案2】:

    要使用 .NET FW 4.0,您应该使用旧版激活 shim 代码将 .NET FW 作为 COM 组件加载 进入您的托管应用程序,如下所示:

    使用宏

    #define LEGACY_ACTIVATION_SHIM_ALLOW_LEGACY_API_FALLBACK
    

    Sudoku.Runtime.h:

    #pragma once
    // 
    extern "C" int wWinMainCRTStartup();
    

    Sudoku.Runtime.cpp:

    // Sudoku.Runtime.cpp : Defines the entry point for the application.
    //
    
    #include "stdafx.h"
    
    int _runtime()
    {
        wWinMainCRTStartup();
        return 0;
    }
    
    int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
    {
        try
        {
            //CoInitializeEx(NULL, 0);              
            //CoUninitialize();
            HRESULT hr;     
            ICorRuntimeHost *pHost = NULL;
            hr = LegacyActivationShim::CorBindToRuntimeEx(NULL, NULL, STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN_HOST, CLSID_CorRuntimeHost, IID_ICorRuntimeHost, reinterpret_cast<LPVOID*>(&pHost));
            if (!FAILED(hr))
            {
                IUnknown *pAppDomainPunk = NULL;
                hr = pHost->CreateDomainEx(TEXT("_runtime"), NULL, NULL, &pAppDomainPunk);
                if (!FAILED(hr))
                {
                    _::_AppDomain *pDefaultDomain = NULL;
                    hr = pAppDomainPunk->QueryInterface(__uuidof(_::_AppDomain), reinterpret_cast<LPVOID*>(&pDefaultDomain));
                    if (!FAILED(hr))
                    {
                        _::_ObjectHandle *pObjHandle = NULL;
                        hr = pDefaultDomain->CreateInstance(_bstr_t("Sudoku"), _bstr_t("Sudoku.Runtime"), &pObjHandle); 
                        if (!FAILED(hr))
                        {
                            VARIANT v;
                            VariantInit(&v);
                            hr = pObjHandle->Unwrap(&v);
                            if (!FAILED(hr))
                            {
                                _::IRuntime *pRemotingHost = NULL;
                                hr = v.pdispVal->QueryInterface(__uuidof(_::IRuntime), (void**) &pRemotingHost);    
                                if (!FAILED(hr))
                                {
                                    ::System::Reflection::Assembly^ ra = Assembly::GetExecutingAssembly();
                                    array<::System::Byte>^ bytes = ra->GetName()->GetPublicKeyToken();
                                    SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, bytes->Length);
                                    BYTE *pData;
                                    hr = SafeArrayAccessData(psa, (void **)&pData);
                                    if (!FAILED(hr))
                                    {
                                        for(int i=0; i < bytes->Length; i++) pData[i] = bytes[i];
                                        hr = SafeArrayUnaccessData(psa);
                                        if (!FAILED(hr))
                                        {
                                            pRemotingHost->Run(psa);
                                        }
                                        pHost->UnloadDomain(pAppDomainPunk);
                                    }
                                }
                                pObjHandle->Release();
                            }
                            pDefaultDomain->Release();
                        }
                        pAppDomainPunk->Release();
                    }
                    pHost->Release();
                }
                LegacyActivationShim::CorExitProcess(0);
            }
        }
        catch(...)
        {
        }
        return 0;
    }
    

    stdafx.h:

    // stdafx.h : include file for standard system include files,
    // or project specific include files that are used frequently, but
    // are changed infrequently
    //
    
    #pragma once
    
    #include "targetver.h"
    // TODO: reference additional headers your program requires here
    
    // Exclude rarely-used stuff from Windows headers
    #define VC_EXTRALEAN
    #define WIN32_LEAN_AND_MEAN   
    
    #import <mscorlib.tlb> auto_rename \
        rename("value", "___value") \
        rename("ReportEvent", "___ReportEvent") \
        rename_namespace("_") \
        raw_interfaces_only \
        high_property_prefixes("_get","_put","_putref")
    
    #import "..\\Public\\Sudoku.tlb" auto_rename \
        rename_namespace("_") \
        raw_interfaces_only \
        high_property_prefixes("_get","_put","_putref")
    
    // C RunTime Header Files
    #include <tchar.h>
    
    #include "cor.h"
    #include "mscoree.h"
    #include "strongname.h"
    
    #include "Sudoku.Runtime.h"
    #include "AssemblyInfo.h"
    #include "Resource.h"
    
    
    #define LEGACY_ACTIVATION_SHIM_ALLOW_LEGACY_API_FALLBACK
    
    #include "LegacyActivationShimDelayLoad.h"
    

    LegacyActivationShim.h:

    // ==++==
    // 
    //   Copyright (c) Microsoft Corporation.  All rights reserved.
    // 
    // ==--==
    //
    // LegacyActivationShim.h
    //
    // This file allows simple migration from .NET Runtime v2 Host Activation APIs
    // to the .NET Runtime v4 Host Activation APIs through simple shim functions.
    // To use, just include this header file after the header file that declares the
    // deprecated APIs you are using, and append the "LegacyActivationShim::" namespace
    // in front of all deprecated API calls.
    //
    // For example,
    //      #include "mscoree.h"
    //      ...
    //      CorBindToRuntimeEx(
    //          NULL, NULL, 0, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID *)&pRH));
    // becomes
    //      #include "mscoree.h"
    //      #include "LegacyActivationShim.h"
    //      ...
    //      LegacyActivationShim::CorBindToRuntimeEx(
    //          NULL, NULL, 0, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID *)&pRH));
    //
    // To enable fallback to the legacy APIs when v4.0 is not installed on the machine,
    // define LEGACY_ACTIVATION_SHIM_ALLOW_LEGACY_API_FALLBACK before including this
    // header file.
    //
    // To use the legacy API fallback in a delay-loaded fashion, include LegacyActivationShimDelayLoad.h
    // instead.
    //
    

    Sudoku.Runtime.cs:

    [Serializable]
    [ComVisible(true)]
    [Obfuscation(Exclude = true)]
    public class Runtime : IRuntime
    {    
        public void Run(byte[] publikKeyToken)
        {
            Application.Run(publikKeyToken);
        }
    }
    
    [ComVisible(true)]
    [Obfuscation(Exclude = true)]
    public interface IRuntime
    {
        void Run(byte[] publikKeyToken);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-24
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2016-07-13
      • 2015-12-19
      相关资源
      最近更新 更多