gpt4 book ai didi

c# - 在 C++(win32 应用程序)中使用 C# 类时出现 EEFileLoadException

转载 作者:IT王子 更新时间:2023-10-29 04:16:30 27 4
gpt4 key购买 nike

出于部署原因,我尝试使用 IJW 在 C++ 中包装 C# 程序集,而不是使用 COM Callable Wrapper。

我在其他项目上也这样做过,但在这个项目上,我遇到了 EEFileLoadException。任何帮助将不胜感激!

托管 C++ 包装器代码(在 DLL 中):

extern "C" __declspec(dllexport) IMyObject* CreateMyObject(void)
{
//this class references c# in the constructor
return new CMyWrapper( );
}

extern "C" __declspec(dllexport) void DeleteMyObject(IMyObject* pConfigFile)
{
delete pConfigFile;
}

extern "C" __declspec(dllexport) void TestFunction(void)
{
::MessageBox(NULL, _T("My Message Box"), _T("Test"), MB_OK);
}

测试代码(这是一个 EXE):

typedef void* (*CreateObjectPtr)();
typedef void (*TestFunctionPtr)();

int _tmain testwrapper(int argc, TCHAR* argv[], TCHAR* envp[])
{
HMODULE hModule = ::LoadLibrary(_T("MyWrapper"));
_ASSERT(hModule != NULL);

PVOID pFunc1 = ::GetProcAddress(hModule, "TestFunction");
_ASSERT(pFunc1 != NULL);
TestFunctionPtr pTest = (TestFunctionPtr)pFunc1;

PVOID pFunc2 = ::GetProcAddress(hModule, "CreateMyObject");
_ASSERT(pFunc2 != NULL);
CreateObjectPtr pCreateObjectFunc = (CreateObjectPtr)pFunc2;

(*pTest)(); //this successfully pops up a message box
(*pCreateObjectFunc)(); //this tosses an EEFileLoadException

return 0;
}

就其值(value)而言,事件日志报告如下:.NET 运行时版本 2.0.50727.143 -致命执行引擎错误 (79F97075) (80131506)

遗憾的是,Microsoft 没有关于该错误的信息。

最佳答案

问题出在 DLL 所在的位置。

  • c:\dlls\managed.dll
  • c:\dlls\wrapper.dll
  • c:\exe\my.exe

我通过将 managed.dll 复制到 c:\exe 来确认这一点,并且它没有问题。显然,CLR 不会在非托管 DLL 的路径中查找托管 DLL,而只会在可执行文件所在的位置查找它。 (或在 GAC 中)。

出于不值得深入探讨的原因,这是我需要的结构,这意味着我需要在托管 dll 中帮助 CLR。见下面的代码:

程序集解析器.h:

/// <summary>
/// Summary for AssemblyResolver
/// </summary>
public ref class AssemblyResolver
{
public:

static Assembly^ MyResolveEventHandler( Object^ sender, ResolveEventArgs^ args )
{
Console::WriteLine( "Resolving..." );

Assembly^ thisAssembly = Assembly::GetExecutingAssembly();
String^ thisPath = thisAssembly->Location;
String^ directory = Path::GetDirectoryName(thisPath);
String^ pathToManagedAssembly = Path::Combine(directory, "managed.dll");

Assembly^ newAssembly = Assembly::LoadFile(pathToManagedAssembly);
return newAssembly;
}

};

包装器.cpp:

#include "AssemblyResolver.h"

extern "C" __declspec(dllexport) IMyObject* CreateMyObject(void)
{
try
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
currentDomain->AssemblyResolve += gcnew ResolveEventHandler( AssemblyResolver::MyResolveEventHandler );

return new CMyWrapper( );
}
catch(System::Exception^ e)
{
System::Console::WriteLine(e->Message);

return NULL;
}
}

关于c# - 在 C++(win32 应用程序)中使用 C# 类时出现 EEFileLoadException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/93770/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com