情况:
在我的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外部函数没有这样的问题(我可以离开"托管进程"启用和"本机代码调试"禁用没有任何问题)但我无法找到导致此错误的两种解决方案之间的区别。
非常感谢任何帮助!
答案 0 :(得分:0)
通过在c ++项目属性中禁用代码优化 - > C / C ++ - >优化我已经能够在c ++代码中找到未处理的异常。在修复了一些小的内存泄漏之后,我设法使其工作,即使托管进程处于活动状态并禁用本机代码调试。