CLR干扰C ++ STD?

时间:2009-05-03 23:36:16

标签: c++ visual-studio clr std

我在clr和其他代码中编译了一些代码,这些代码在单个项目中是不受管理的。

我的common.h文件包含了我需要的所有std库头文件。它由manager.h(manager.cpp的前向声明(无CLR))包含,它由main_window.h(WinForm)包含,它包含在document_manager.cpp(CLR)中。

在运行时我得到各种奇怪的行为,在一个例子中,我的表单不会加载。暂停程序调试多次表明它在malloc.c中为std :: string重新分配内存。通过更改代码,我可以在ostream中收到System :: InvalidMemory(我认为)异常。

如何阻止CLR管理std库?

如果有人想要我的任何文件的来源,请问。

编辑: 在callstack中,我有一些托管代码在我的表单加载时运行。在窗口init回调中,我有一个托管到本机的转换,然后是我的经理类。后来,我到了

    std::string error_msg;
    error_msg = "Storage Manager: SQLite Error ("; <-- Executing Currently
    error_msg += sqlite3_errcode(this->db_p);
    error_msg += ") - ";
    error_msg += sqlite3_errmsg(this->db_p);
    *(this->log) << error_msg.c_str() << std::endl;

并且callstack显示了std :: basic_string :: assign,然后是其他一些std :: functions,最后是malloc函数,它永远停留在。

编辑: 文件写入时抛出的异常:

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at manager.file_open(manager* , basic_string<char\,std::char_traits<char>\,std::allocator<char> >* )
   at DocumentManager.main_window.file_open_mainmenu_Click(Object sender, EventArgs e) in c:\development\document manager\document manager\main_window.h:line 456
   at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
   at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
   at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ToolStrip.WndProc(Message& m)
   at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

3 个答案:

答案 0 :(得分:2)

您是否尝试过#pragma unmanaged / #pragma管理您需要保持不受管理的功能?虽然用一种“令人窒息的热情”语气写成,http://www.ondotnet.com/pub/a/dotnet/2003/03/03/mcppp2.html确实有一些关于混合托管和非托管代码/对象的技巧。

答案 1 :(得分:1)

我认为你的描述可能会受到一个定义规则的影响。在C ++中,您可以为一个类定义多个,但它们应该完全相同。这允许您将类定义放在标头中。

你仍然要小心“相同”的部分。这并不仅仅意味着源代码中的标记,而是它们在prceprocessor之后的替换以及(在实践中)给定当前编译器设置的意义。一个明显的例子是32/64位开关,或对齐设置 - 这些可能会改变一个类的大小。

在您的情况下,您可能在不同的设置下有两个Microsofts STL类的定义。

答案 2 :(得分:0)

只是在黑暗中拍摄,但尝试关闭对使用STL的CPP文件的CLR支持。This question显示了如何为单个CPP文件执行此操作。它有效地将它们本地编译。

公平警告:如果你走这条路线,你可能不得不关闭你编译的本地编译的CPP文件的预编译标题。