我正在包装一个MFC扩展DLL(MFCXDLL_2),以使其功能可供C#程序员使用.
包装器是"使用共享MFC DLL的常规DLL"和"公共语言运行时支持(/ clr)".(混合模式).
MFCXDLL_2中可用的类以MFCXDLL_3进行修饰.
我遇到的情况是在本机应用程序中运行的C#.NET用户控件中使用MFCXDLL_2的情况.
本机应用程序中的另一个MFC扩展DLL -MFCXDLL_1也使用MFCXDLL_2,这会导致麻烦.
当我启动本机应用程序时,它将隐式加载MFCXDLL_2.
当我加载.NET用户控件时,根据http://msdn.microsoft.com/en-us/library/ksa99t88.aspx,"使用数据库,OLE和套接字扩展"中的建议,再次显式加载相同的MFCXDLL_2.常规DLL中的DLL".
本机代码和.NET用户控件都实例化相同的类类型,并在MFCXDLL_2中调用相同的方法.
该方法对数据进行反序列化(通过共享内存接收)并将反序列化数据返回给调用者.这在本机代码中运行良好,直到我加载.NET用户控件.
加载.NET用户控件后,反序列化将停止使用本机代码,但从.NET用户控件调用时效果很好.
我将WinDbg附加到本机应用程序的调试版本并运行我的方案.在反序列化期间,WinDbg发现如下:
"警告:无法从存档加载.类未定义.CArchive异常:badClass."
我认为这里有一些资源问题所以我运行本机应用程序的发布版本加载MFCXDLL_2的发布版本.然后我加载.NET用户控件的调试版本 - 它再次将调试版本的MFCXDLL_2-加载到本机应用程序中.
然后一切都很好.由本机代码加载的MFCXDLL_2的一个发行版本和由.NET用户控件加载的一个MFCXDLL_2调试版本 - 在本机应用程序内运行.
那么发生了什么?是否无法在同一应用程序中同时从扩展DLL和常规DLL访问相同的MFCXDLL?
资源链是否以某种方式被破坏?有哪些可能的解决方案?
下面是一些代码,显示如何加载MFCXDLL_2 DLL
当本机应用程序启动时,调用MFCXDLL_2 DLLMain:
static AFX_EXTENSION_MODULE MFCXDLL_2 = { NULL, NULL };
static CDynLinkLibrary* gpDynLinkLibrary = NULL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID )
{
if (dwReason == DLL_PROCESS_ATTACH)
{
// Extension DLL one-time initialization
AfxInitExtensionModule(MFCXDLL_2, hInstance);
// Insert this DLL into the resource chain
gpDynLinkLibrary = new CDynLinkLibrary(MFCXDLL_2);
}
else if …Run Code Online (Sandbox Code Playgroud)