Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将CLR实现到旧的MFC/Win32 DLL中,并将DLL托管到MFC/Win32应用程序中_C++_Mfc_Clr_Unmanaged_Managed - Fatal编程技术网

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

C++ 将CLR实现到旧的MFC/Win32 DLL中,并将DLL托管到MFC/Win32应用程序中,c++,mfc,clr,unmanaged,managed,C++,Mfc,Clr,Unmanaged,Managed,我有一个旧的MFC应用程序,我目前将旧的MFC/Win32 DLL导入其中 在这个旧的DLL中,我的任务是编写一组多线程代码,我计划使用.NET framework编写这些代码(因此需要CLR) 我以前在这方面做过一些尝试,即使我可以使用CLR正确编译项目,我发现在将DLL加载到MFC/Win32应用程序后,只要我尝试使用DLL的用户界面(用MFC编写),应用程序就会崩溃,并指出用户界面有问题 这个DLL总是在没有CLR的情况下工作,所以我知道它没有损坏 在我的项目中实现CLR的最佳方式是什么,

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

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

我以前在这方面做过一些尝试,即使我可以使用CLR正确编译项目,我发现在将DLL加载到MFC/Win32应用程序后,只要我尝试使用DLL的用户界面(用MFC编写),应用程序就会崩溃,并指出用户界面有问题

这个DLL总是在没有CLR的情况下工作,所以我知道它没有损坏

在我的项目中实现CLR的最佳方式是什么,即使它只针对一个类

编辑:我目前只能在我需要的一个类上使用CLR生成代码,但我加载DLL的应用程序在尝试加载DLL中包含的用户界面时仍会崩溃

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

_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
    { ASSERT(afxCurrentResourceHandle != NULL);
        return afxCurrentResourceHandle; }
EDIT3:我已经取得了进步,但仍然没有成功!显然,在用户界面中创建页面对象之前,必须使用
AFX\u MANAGE\u 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当然不是空的:
pObject:0x043fd4fc{CWnd hWnd=0x002c0abe}

除非您可以,否则将MFC和.NET/CLR结合起来不太可能工作。即使那样,我也会极力劝阻;这两个框架不打算同时使用。请记住,即使不使用MFC,也只能使用一个GUI线程

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

static UINT Go(LPVOID pParam);

然后从班上其他地方调用
AfxBeginThread(Go,this)
。重铸pParam以指向类的指针,然后开始对其调用函数。您不必使用任何花哨的东西使该策略在MFC中工作,而且您已经拥有了所有可用的标准Win32/MFC/C++资源。告诉我你需要什么从.NET,我敢打赌,我可以找到一种方式做同样的事情在C++或通过com。< /p>听起来有趣…你有详细的错误信息给我们吗?你能给我们提供“CLR加载”代码吗?你有没有试过运行一个只有MFC/Win32窗口和CLR加载的小示例应用程序?你能给我们提供这个示例应用程序吗?你能告诉我你的dll是MFC扩展dll还是常规dll吗?这是一个扩展dll。它导入主机应用程序的API,以允许主机应用程序启动其配置“页面”。(至少我是这么理解的,它只能在这个应用程序中使用)