如果禁用本机代码调试,则在调用extern函数时,vshost32-clr2.exe会挂起

时间:2016-08-02 15:41:24

标签: c# c++ visual-studio-2013 visual-studio-debugging native-code

情况:

在我的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启动应用程序)

  • 当我禁用"启用本机代码调试"在项目属性中

  • 当我启用"启用Visual Studio托管流程"

我的想法

好像" vshost32-clr2.exe"停止工作,因为如果"本机代码调试"它不能执行C extern函数。被禁用。 它似乎需要一些仅在本地代码调试时才会给出的功能"已启用。

我的问题似乎与AccessViolationException goes away when native code debugging is enabled相同,但没有人已经回答了为什么会发生这种情况。

我的问题 为什么?对于另一个项目,我已经做了一个不同的解决方案,调用不同的C外部函数没有这样的问题(我可以离开"托管进程"启用和"本机代码调试"禁用没有任何问题)但我无法找到导致此错误的两种解决方案之间的区别。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

通过在c ++项目属性中禁用代码优化 - > C / C ++ - >优化我已经能够在c ++代码中找到未处理的异常。在修复了一些小的内存泄漏之后,我设法使其工作,即使托管进程处于活动状态并禁用本机代码调试。