3

clr の下でコンパイルするコードと、単一のプロジェクトで管理されていない他のコードがあります。

私の common.h ファイルには、必要な std ライブラリ ヘッダーがすべて含まれています。これは、document_manager.cpp (CLR) によってインクルードされる main_window.h (WinForm) によってインクルードされる manager.h (manager.cpp (CLR なし) の前方宣言) によってインクルードされます。

実行時に、あらゆる種類の奇妙な動作が発生します。あるインスタンスでは、フォームが読み込まれません。デバッグのためにプログラムを数回一時停止すると、malloc.c で std::string のメモリを再割り当てしていることがわかりました。コードを変更することで、ostream で System::InvalidMemory (と思われる) 例外を受け取ることができます。

CLR が std ライブラリを管理しないようにするにはどうすればよいですか?

私のファイルのソースが欲しい人がいたら、聞いてください。

編集: コールスタックには、フォームの読み込み時に実行されるマネージド コードがいくつかあります。ウィンドウの 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;

コールスタックには、std::basic_string::assign、次に他の std:: 関数、最後に 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)
4

3 に答える 3

2

#pragma unmanaged / #pragma managed を非管理のままにしておく必要がある関数をラップしようとしましたか? 一種の「息をのむような熱意」の口調で書かれていますが、http: //www.ondotnet.com/pub/a/dotnet/2003/03/03/mcppp2.html には、マネージ コード/オブジェクトとアンマネージ コード/オブジェクトを混在させるためのヒントがいくつかあります。

于 2009-05-03T23:59:40.853 に答える
1

あなたの説明から、あなたは 1 つの定義ルールに該当する可能性があると思います。C++ では、1 つのクラスに対して複数の定義を使用できますが、それらはすべて同一である必要があります。これにより、クラス定義をヘッダーに入れることができます。

「同一」の部分にはまだ注意が必要です。これは、ソース コード内のトークンだけを意味するのではなく、prceprocessor の後のトークンの置き換えと、(実際には) 現在のコンパイラ設定でのそれらの意味を意味します。明確な例は、32/64 ビット スイッチまたはアライメント設定です。これらはクラスの sizeof を変更する可能性があります。

あなたの場合、Microsoft の STL クラスの 2 つの定義が異なる設定である可能性があります。

于 2009-05-04T07:31:00.753 に答える
0

暗闇の中でのショットですが、STL を使用している CPP ファイルの CLR サポートをオフにしてみてください。この質問は、個々の CPP ファイルに対してそれを行う方法を示しています。それらをネイティブに効果的にコンパイルします。

公正な警告: このルートを使用する場合、ネイティブにコンパイルした CPP ファイルのプリコンパイル済みヘッダーをオフにする必要がある場合があります。

于 2009-05-04T01:05:30.443 に答える