作者gz ()
看板C_Sharp
标题Re: [问题] 请问在 managed 专案当中写 unmagaed, …
时间Mon Oct 15 20:39:02 2007
没用过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
1F:推 llama:感谢你热情的指导 :) 10/17 10:36