vshost32-clr2.exe挂
问题描述:
在我的C#解决方案(VS 2013年)我加入一个C的项目。的C项目包含一个声明在C#中使用函数:
[DllImport("My_C_Dll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void My_C_Function(IntPtr OutputArray, int Input);
的函数调用此代码:
var OutputArray = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(UInt16)) * OutputLength);
My_C_Function(OutputArray, Input);
Int16[] ManagedOutputArray= new Int16[OutputLength];
Marshal.Copy(OutputArray, ManagedOutputArray, 0, OutputLength);
Marshal.FreeHGlobal(OutputArray);
问题:
当 “My_C_Function” 之称当满足以下所有条件时,应用程序挂起(实际上是挂起的Visual Studio宿主进程“vshost32-clr2.exe”):
当我与附接(从Visual Studio中启动应用程序)
调试器中运行时,我DISABLE“启用本地代码调试”中的项目属性
当我ENABLE“启用的视觉工作室宿主进程”
我的想法
看来,“vshost32-clr2.exe”停止工作,因为如果禁用“本地代码调试”,则无法执行C extern函数。 它似乎只需要启用“本地代码调试”时才会提供某些功能。
我的问题似乎与AccessViolationException goes away when native code debugging is enabled一样,但没有人已经回答了为什么发生这种情况。
我的问题 为什么?对于另一个项目,我已经做了一个不同的解决方案,调用一个不同的C extern函数,但没有这样的问题(我可以不启动“托管进程”并禁用“本机代码调试”而没有任何问题),但是我找不到两者之间的区别导致此错误的解决方案。
任何帮助将不胜感激!
答
通过禁用C++项目属性中的代码优化 - > C/C++ - >优化我已经能够在C++代码中找到未处理的异常。修复了一些小的内存泄漏之后,我甚至在主机进程处于活动状态并禁用了本地代码调试的情况下设法使其工作。
启用JIT调试或异常窗口,您是否收到任何异常消息?对于混合模式调试,我们需要在C#项目中启用本地代码调试。如果您禁用主机进程并启用本地代码调试,那么您是否正常调试您的应用程序? –
@Jack Zhai如果我禁用了主机并且启用了本地代码调试功能,它就可以工作。只有当我使用托管没有本地代码调试宿主进程挂起。我设置Visual Studio停止在任何可能的异常(抛出和用户未处理),但调试器不停止。我一步一步地运行代码,注意到当我调用“My_C_Function”时它会挂起。 – Homer1982
在输出窗口中是否收到任何消息? –