推 llama:感謝你熱情的指導 :) 10/17 10:36
沒用過MC++的old syntax, 不過用C++/CLI有一段時間了, 應該是差不多
※ 引述《llama (阿譽)》之銘言:
: ※ [本文轉錄自 C_and_CPP 看板]
: 作者: llama (阿譽) 看板: C_and_CPP
: 標題: [問題] 請問在 managed 專案當中寫 unmagaed,卻又沒宣告 #pragema
: 時間: Sat Oct 13 11:38:10 2007
: 您好!! 我想請問一下,如果開啟一個 managed 專案(例如 WinForm)
: 在裡頭定義了一些 unmanaged type(例如 c++ STL...等等不是.NET SDK)
: 可是沒有宣告 #pragma unmanaged,這樣的話,這些資源 gc 管的到嘛?
GC只負責managed memory, 所以答案是: 管不到
: 之前在訂定類別的時候,在某個成員函式當中使用 Win32 API,以及
: 宣告 API 所需要的結構,結果發生以下狀況:
: private __gc class AppManager
: {
: public:
: AppManager() : childHwnd(0), childHANDLE(0) {}
: void runApp( String *path, PictureBox *appLoader )
: {
: // 將 String* 轉換成寬字元的 wchar_t*
: const wchar_t __pin *lpApplicationName = PtrToStringChars(path);
: // 初始化 CreateProcess 所需要的結構 STARTUPINFO 以及 PROCESS_INFORMATION
: static STARTUPINFO si;
: static PROCESS_INFORMATION pi;
: ZeroMemory( &si, sizeof(STARTUPINFO) );
: ZeroMemory( &pi, sizeof(PROCESS_INFORMATION) );
: si.cb = sizeof(STARTUPINFO);
: si.dwFlags = STARTF_USESHOWWINDOW;
: si.wShowWindow = SW_SHOWNORMAL;
: CreateProcess( lpApplicationName, NULL, NULL, NULL,
: false, 0, NULL, NULL, &si, &pi );
: ...
: }
: private:
: Int32 childHANDLE;
: Int32 childHwnd ;
: }; // 正常運作
: 一旦我將上面兩行紅色的結構移動到 private 當作 field,就會發生無法將
: managed type 轉換成 unmanaged type,所以就對 managed/unmanaged type 產生
: 疑問,甚至到底需不需要加上 #pragma unmanaged,才讓 CLR 不去管理?對於以上
: 範例我是好奇在區域變數 GC 是怎麼管(感覺這種它就沒在管)。
managed class的member只允許managed types, 所以你的宣告應該是pointer:
private:
static STARTUPINFO* si;
...
宣告成這種interior pointer, 才能於managed class混合unmanaged types
然而interior pointer和一般pointer是不一樣的,
所以你的轉換才會失敗. 相信compiler已經警告過你了
正確的作法應該是要用之前先將此pointer定(pin)住,
C++/CLI是這樣: pin_ptr<STARTINFO*> p = &si;
MC++不知道, 不過我看到你的code有__pin的關鍵字, 應該作法類似
至於你的問題, 答案是: 既然GC沒辦法管到unmanaged resources, 它當然不會去管,
它也不允許我們把責任推給它(所以只能用interior pointer)
local variables 當然也不會被GC管, 還是老話一句:GC只負責managed memory.
所以你的感覺沒錯:)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.229.152.241