我正在使用面向.NET Framework 3.5的Windows 7 32位操作系统上的Visual Studio 2008编译带有/ clr选项的C ++代码。
所有DLL都是32位(使用Dependency Walker进行验证)。
根据我的研究,当32位代码调用64位DLL时会出现此错误,但这不是这种情况。
是否还有其他错误的根本原因0xc000007b?
答案 0 :(得分:2)
刚好碰巧解决了这个问题。 似乎这个错误不仅由32位代码中的64位库混合引起,而且当库被搞砸时 - 在我的情况下我使用的是二进制PCRE库。
我使用MingW自己构建了PCRE,现在一切正常。
答案 1 :(得分:0)
对于.NET FW 4.0的使用,您应该使用旧版激活填充程序代码将.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);
}