EEFileLoadException利用の場合はC#の授業C++(win32アプリ)
-
01-07-2019 - |
質問
の展開のための理由で行うことにより利用IJWを包むC#組み立てC++を使わずCOMの呼び出し可能オブジェクト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;
}
そのようなイベントのログは以下:.NETランタイム版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のみに見つかえば直通なので大変助かりに実行可能です。(GAC).
理由なく、この構造が必要とされていることからも、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を削減や難読化を行える**"デバッガタイプ"を"混合"モードになります。(プロジェクトプロパティ->コンフィグレーションプロパティ->デバッグ)
この他にも、ポイント(ない場合があるに関連したものでなければなります)私の経験る要因にもなっています。-Windows8(厳セキュリティお試しください開始のおVSとしてのadmin.-うためのx86設定を使用x86binaries.-時計用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 MVCます。の呼び出しスタックおよび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>
私は様々なカスタマーサポートしまいました。独自のセキュリティの図NuGetバージョン4.0.30319がこの行のコンフィグにした指導、サーバへリダイレクト着バージョン3.0.1.0おり、なくなった。更新のコンフィグresovled私の課題です。
実際にデバッガネイティブC++プロジェクトを使用するC++管理dllになる場合があります。時VS2010チでお申込後に一部の例外チェーンが中断されてみるのも良いでしょう例外のフィルター(メニュー|デバッグ|Excpetion)を無効にすべてC++の例外をスローしました。でもこの例外を出力でもお申込みいabort