我reorganzing混合(管理和非管理DLL)的应用程序,以便在主应用程序段是非托管MFC遗留和,将调用一个C ++ DLL使用/ clr编译标志,该标志将弥合之间的通信的管理(C#DLL)的与非托管代码。 Unfortuantely,我的改变导致访问冲突,应用程序的InitInstance之前发生()被调用。这使得调试变得非常困难。我得到的唯一信息是以下堆栈跟踪。

>   64006108()  
ntdll.dll!_ZwCreateMutant@16()  + 0xc bytes 
kernel32.dll!_CreateMutexW@12()  + 0x7a bytes   

所以,这里有一些sceanrios我已经试过。点击 - 开机状态者除外>的Win32者除外> 0000005访问冲突时抛出的突破。仍然是最详细的我得到的是从上面的堆栈跟踪。我试着F10的应用程序,但任何断点被击中,并未能与上述堆栈跟踪之前失败。 搜索结果 - 我掐灭桥DLL,以便它只有一个方法,它返回一个布尔值和方法进行编码只返回false(不叫C#代码)

bool DllPassthrough::IsFailed() { return false; }

如果该存根DLL与/ CLR标志编译,该应用程序失败。如果它被编译没有/ CLR标志,在应用程序运行。搜索结果 - 我使用Visual Studio向导多文档应用程序创建一个存根MFC应用程序并调用DllPassthrough :: IsFailed()。这种成功甚至用来编译DLL的/ CLR标志。搜索结果 - 我试着做在WINMM.LIB手动调用LoadLibrary如下面的音符的访问冲突使用C ++ / CLI 时。该应用程序仍然失败。搜索结果 所以,我的问题是如何解决这个问题?任何提示,策略,或以前的事件。而且,做不到这一点,我怎么能得到什么代码段或库导致访问异常的更多信息?如果我尝试喜欢做的LoadLibrary调用更复杂的解决方法,我想它缩小到失败的库。 搜索结果 谢谢。顺便说一句,我们使用Visual Studio 2008和项目正在建设针对的管理部分中的.NET 2.0框架。

有帮助吗?

解决方案

我相信我解决我的问题。通过系统地移除每个库参考和 注释掉在应用程序代码(托管)该特定库中的电话,我终于去掉了问题库,得到了程序运行。这是诊断问题的蛮力方式,幸亏我没有去除过多的库来解决这个问题。我还是很好奇,如果任何人有意见,如果该库可能已经确定,尽管调试器。点击 因此,下一步是将这些库调用到托管代码,并通过通过我的桥DLL的信息反馈给非托管方。顺便说一句,我重返了WINMM.LIB到项目中,它仍然有效。

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