2011-11-09 51 views
3

我正在使用Visual Studio 2008在Windows 7 32位操作系統上針對.NET Framework 3.5編譯我的C++代碼和/ clr選項。0xc000007b錯誤 - 但所有的DLL都是32位

所有的DLL都是32位(使用Dependency Walker進行驗證)。

根據我的研究,當32位代碼調用64位DLL時會出現此錯誤,但這裏並不是這種情況。

是否有任何其他錯誤0xc000007b的根本原因?

+0

一個針對與Itanium完全不同的機器體系結構的DLL。你至少知道troublemaker DLL嗎?在輸出窗口中查找。 –

回答

2

恰好解決了這個問題。 看來,這個錯誤是不僅由32位代碼混合64位庫引起的,而且當庫混亂 - 在我的情況下,我使用二進制PCRE庫。

我用MingW自己打造PCRE,現在一切正常。

-1

對於使用.NET FW 4.0,你應該使用傳統的激活代碼墊片加載.NET FW作爲COM組件 到您的託管應用程序,如:

使用微距

#define LEGACY_ACTIVATION_SHIM_ALLOW_LEGACY_API_FALLBACK 

數獨.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); 
} 
相關問題