将CLR实现为旧的MFC / Win32 DLL并将DLL托管到MFC / Win32应用程序中

时间:2011-12-01 21:20:23

标签: c++ mfc clr unmanaged managed

我有一个旧的MFC应用程序,我目前将旧的MFC / Win32 DLL导入。

在这个旧的DLL中,我的任务是编写一堆多线程代码,我计划使用.NET框架编写代码(因此需要CLR)。

我之前已经解决了这个问题,即使我可以使用CLR正确编译项目,我发现只要我在加载DLL后尝试使用DLL的用户界面(用MFC编写)进入MFC / Win32应用程序,应用程序将崩溃指向用户界面的问题。

这个DLL一直没有CLR,所以我知道它没有被破坏。

在我的项目中实现CLR的最佳方法是什么,即使它仅适用于一个类?

编辑:我目前只能在我需要的一个类上获取使用CLR构建的代码,但是在加载用户界面时我加载DLL的应用程序仍然崩溃包含在DLL中。

EDIT2 :我已经发现afxCurrentResourceHandle afxwin1.inl上的断言失败了。在做了更多阅读之后,我感觉这与MFC在“共享DLL”而不是“静态DLL”中有关。这个断言有解决方法吗?

_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
    { ASSERT(afxCurrentResourceHandle != NULL);
        return afxCurrentResourceHandle; }

EDIT3 :我已经取得了进展,但仍然没有断言!显然,在用户界面中创建页面对象之前,必须使用AFX_MANAGE_STATE宏来定义afxCurrentResourceHandle!

这是我的意思的一个例子:

CPropertySheet Sheet("Config"); //Assume this is defined
AFX_MANAGE_STATE(AfxGetStaticModuleStatus());

CConfigPage ConfigPage;
CTestPage TestPage;

//Now I am failing an assertion when trying to run the following code
if (Sheet.DoModal() == ID_OK)
{
    //Do stuff...
}

目前失败的断言是:

CObject* AFX_CDECL AfxStaticDownCast(CRunTimeClass* pClass, CObject* pObject)
{
    ASSERT(pObject == NULL || pObject->IsKindOf(pClass));
    return pObject
}

pObject肯定不是null:pObject: 0x043fd4fc {CWnd hWnd=0x002c0abe}

1 个答案:

答案 0 :(得分:0)

组合MFC和.NET / CLR不太可行,除非你可以recompile the old MFC application with CLR support。即便如此,我强烈反对它;这两个框架不打算同时使用。请记住,即使您不使用MFC,也只能使用一个GUI线程。

更好的解决方案是使用标准的MFC线程机制。这真的不难;只需使用如下成员函数创建一个新类:

static UINT Go(LPVOID pParam);

然后从班级中的其他地方拨打AfxBeginThread(Go, this)。重新生成pParam以指向您的类,然后开始调用它上面的函数。您不必使用任何花哨的东西来使该策略在MFC中工作,并且您已获得所有可用的标准Win32 / MFC / C ++资源。告诉我你从.NET需要什么,我打赌我可以找到一种方法在C ++或COM中做同样的事情。