EEFileLoadException时,使用C#类在C++(win32应用程序)
-
01-07-2019 - |
题
部署的原因,我正尝试使用IJW包C#大会在C++而不是使用COM可调用的包装。
我已经做到了在其他项目上,但是在这一个,我得到一个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;
}
为什么它的价值,事件记录报告如下:.净运行时版本2.0.50727.143- 致命的执行引擎的错误(79F97075)(80131506)
不幸的是,微软已经没有关于这一错误。
解决方案
问题是Dll位。
- c:\dlls\managed.dll
- c:\dlls\wrapper.dll
- c:\exe\my.exe
我证实了这一通过复制managed.dll 入c:\exe 和它的工作没有问题。显然,CLR不会看起来对管理Dll中的路径不受管DLL只会寻找它可执行。(或者在同).
对于理由不值得进入的,这是我结构的需要,这意味着,我需要给CLR一方面在于管理dll。看到代码如下:
AssemblyResolver.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;
}
};
Wrapper.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;
}
}
其他提示
第一个问题是确保调试器类型设置混合。然后你得到有用的例外情况。
对于你的本地应用程序耗时的混合模式dll(EXE),改**"调试器的类型",以"混合"模式。(转到项目的性质->构的特性->调试)
还有一些其他问题(这可能不是相关),但以我的经验,他们可能会造成问题。-在窗8(用更严格的安全)请尝试的发动你的VS作为管理员。-确保x86配置使用的x86的二进制文件。-看StrongName验证,如果你C#集会,你正在消耗管理C++作为签署,请考虑签署混合模式dll。
希望这将有所帮助。
在情况下的其他任何人绊倒在这个问题,并且正在使用一个动态组件名称:确保你被剥组件名称,它可能包含的版本,文化和其他内容,你不可以使用。
即, 你MyResolveEventHandler应的形式:
static Assembly^ MyResolveEventHandler( Object^ sender, ResolveEventArgs^ args )
{
Console::WriteLine( "Resolving..." );
String^ assemblyName = args->Name;
// Strip irrelevant information, such as assembly, version etc.
// Example: "Acme.Foobar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
if( assemblyName->Contains(",") )
{
assemblyName = assemblyName->Substring(0, assemblyName->IndexOf(","));
}
Assembly^ thisAssembly = Assembly::GetExecutingAssembly();
String^ thisPath = thisAssembly->Location;
String^ directory = Path::GetDirectoryName(thisPath);
String^ pathToManagedAssembly = Path::Combine(directory, assemblyName );
Assembly^ newAssembly = Assembly::LoadFile(pathToManagedAssembly);
return newAssembly;
}
我是越来越C++EEFileLoadException扔了很多iisexpress.exe 在调试的ASP.NET 软应用程序。呼叫堆和C++例外本身并不非常有助于帮助我脚下的问题。
之后直接指针在C++例外,我最终发现了一个图书馆串这是指向一个旧的版本不再使用。这又是由于一个过期的入口在我的网络。配置文件:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
</dependentAssembly> </assemblyBinding> </runtime>
我已经升级的各种Microsoft。自己的安全图书馆通过NuGet版4.0.30319但是,这一线路在配置是指示的服务器重新定向的呼吁版3.0.1.0,这是现在不再是我的一部分项目。更新配置resovled我的问题。
当你在运行调试器C++地项目,该项目使用C++管理dll你可能会得到这个例外。当VS2010抓住它和你的申请之后,一些链的例外情形,将被中止,你可以尝试在例外的过滤器(菜单|调试|Excpetion)禁止所有用C++的例外情况。你仍然会看到这一例外在输出但您应用程序不中止