質問

の展開のための理由で行うことにより利用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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top