2020年1月16日 星期四

[Log Book] C++\CLI Graphics使用Dispose時遇到 「'Dispose': is not a member of 'System::Drawing::Graphics'」

[問題描述]
在使用C++\CLI將自己寫的演算法包起來給.net使用時,
將System::Drawing::Graphics (managed class)使用Dispose方法釋放資源,
結果遇到「Error C2039 'Dispose': is not a member of 'System::Drawing::Graphics'」


    

[解題思路]
這個問題滿怪的,因為在寫C#時也都這樣使用,
且去看Graphics的定義,也有Dispose這個函式

原本想說,C++ \CLI的相關資源有點少,且這個問題是.net相關的,
所以google: 「.net Dispose is not member graphics 」,
但找不太到,只找到C#相關的資料。
最後google:「C++ Dispose is not member graphics」才找到 [1]。


[解決方法]
在CLI中,要釋放某個managed class資源,要用 delete (如同一般的C++在釋放new的資源一樣)
deleate g;

這好像是因為CLI的IDisposable和其他.net的不一樣,
詳情可以參考[2]中的Resource Management

所以在CLI中使用managed class後,
要釋放都要用一般C++的釋放方式 ─ delete !

或是用using將managed 的程式碼包起來
Using<SqlConnection> connection(new SqlConnection (S"Database=master; Integrated Security=sspi"));

SqlCommand* command = connection->CreateCommand();
command->set_CommandText(S"sp_databases");
command->set_CommandType(CommandType::StoredProcedure);

connection->Open();

Using<SqlDataReader> reader(command->ExecuteReader());

while (reader->Read())
{
    Console::WriteLine(reader->GetString(0));
}

上面那個寫法等同於C#的

using (SqlConnection connection = new SqlConnection("Database=master; Integrated Security=sspi"))
{
    SqlCommand command = connection.CreateCommand();
    command.CommandText = "sp_databases";
    command.CommandType = CommandType.StoredProcedure;

    connection.Open();

    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            Console.WriteLine(reader.GetString(0));
        }
    }
}





參考資料:





這封郵件來自 Evernote。Evernote 是您專屬的工作空間,免費下載 Evernote

沒有留言:

張貼留言