我在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)
答案 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文件的预编译标题。