部署的原因,我正尝试使用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++的例外情况。你仍然会看到这一例外在输出但您应用程序不中止

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top