1

MySQL DB に接続し、安全でないコードを使用して古い C++ dll を使用できる C#.NET アプリケーションを開発しています。

プログラムが開始されるとすぐに、dll が読み込まれ、ポインターが割り当てられます。次に、C# 変数がいくつか初期化され、ポインターが削除されます。

プログラムには、タブコントロールを含むダイアログがあります。この「ダイアログ」のコンストラクターは、古い dll で初期化された変数と DB からデータを取得し、ここで問題が発生します。

        Dictionary<String, int> dizUM;
        MySqlCommand            myCom;
        MySqlConnection         myConn;
        MySqlDataReader         myRead;

        cmbRigheCons.Items.Add( MosaicoS.Properties.Resources.STR_CONS_DESC_GEN );
        cmbRigheCons.Items.Add( MosaicoS.Properties.Resources.STR_CONS_TIP_SOTT );
        cmbRigheCons.Items.Add( MosaicoS.Properties.Resources.STR_CONS_SOTT );
        cmbRigheCons.Items.Add( MosaicoS.Properties.Resources.STR_CONS_NOM_PEZ_CONS );
        cmbRigheCons.SelectedIndex = MosaicoMain.CFG.DescCons;
        cmbRigheVarMat.Items.Add( MosaicoS.Properties.Resources.STR_CONS_DESC_GEN );
        cmbRigheVarMat.Items.Add( MosaicoS.Properties.Resources.STR_CONS_TIP_SOTT );
        cmbRigheVarMat.Items.Add( MosaicoS.Properties.Resources.STR_CONS_SOTT );
        cmbRigheVarMat.Items.Add( MosaicoS.Properties.Resources.STR_CONS_NOM_PEZ_CONS );
        cmbRigheVarMat.Items.Add( MosaicoS.Properties.Resources.STR_CONS_NOM_PEZ_NEL_CONS );
        cmbRigheVarMat.SelectedIndex = MosaicoMain.CFG.DescVarMat;
        try
        {
            string connessione;

            connessione = MosaicoMain.CFG.DBConnection.Replace( "Option=3;", "" );
            connessione = connessione.Replace( "Driver={MySQL ODBC 5.1 Driver};", "" );
            myConn = new MySqlConnection( connessione );
            myCom = new MySqlCommand();
            myConn.Open();
            myCom.Connection = myConn;
            myCom.CommandText = @"SELECT umi_id, umi_um FROM unimis WHERE umi_tipoum = 0 ORDER BY umi_um;";
            myRead = myCom.ExecuteReader();
            dizUM = new Dictionary<String, int>();
            while( myRead.Read() )
                dizUM.Add( myRead.GetString( 1 ), myRead.GetInt32( 0 ) );
            cmbUMSup.DataSource = new BindingSource( dizUM, null );
            cmbUMSup.DisplayMember = "Key";
            cmbUMSup.ValueMember = "Value";
            myRead.Close();
            myConn.Close();
        }
        catch( MySqlException mySqlException )
        {
            MessageBox.Show( mySqlException.ToString() );
        } 

ここで myConn.Open(); からコメントすると myConn.Close() に; 問題はありませんが、接続を開くとほぼ即座にプログラムがクラッシュしますWHEN I SWITCH BETWEEN TABLESが、プログラムのこの部分ではなく、次の場合に発生します。

    private void configurazioniToolStripMenuItem1_Click( object sender, EventArgs e )
    {
        try
        {
            frmConfig = new FrmConfigurazioni();
            frmConfig.ShowDialog();
        }
        catch( Exception exception )
        {
            MessageBox.Show( exception.ToString() );
        }
    }

ここで、前のコード スニペットを読み込みます。エラーは次のとおりです。

Managed Debugging Assistant 'FatalExecutionEngineError' has detected a problem in 
'C:\DEVELOP\MosaicoS\MosaicoS\bin\Debug\MosaicoS.vshost.exe'.
Additional Information: The runtime has encountered a fatal error. 
The address of the error was at 0x792380d9, on thread 0x824. 
The error code is 0xc0000005. 
This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. 
Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.

それは例外ではありません。コードにコメントすると、クラッシュは発生しません。また、別のソリューションで同じ文字列を使用して同じデータベースに接続しようとしても、問題はありません。どうすればこれを解決できますか?

前もって感謝します。

4

1 に答える 1