[問題描述]
在使用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 |
沒有留言:
張貼留言