@@ -102,58 +102,46 @@ public async Task<bool> SetBootOrderAsync(string vmName, List<BootOrderItem> ite
102102 {
103103 return await Task . Run ( ( ) =>
104104 {
105- string timestamp = DateTime . Now . ToString ( "HH:mm:ss.fff" ) ;
106- System . Diagnostics . Debug . WriteLine ( $ "\n [{ timestamp } ] [WMI-START] 开始同步引导顺序: { vmName } ") ;
107-
108105 try
109106 {
107+ // 🟢 关键修改:每次保存都重新获取最鲜活的 VM 和 Settings 句柄
108+ // 不要复用任何外部传入的 ManagementObject
110109 using var vm = GetVmObject ( vmName ) ;
111110 using var settings = GetVmSettings ( vm ) ;
111+
112112 bool isGen2 = settings [ "VirtualSystemSubType" ] ? . ToString ( ) == "Microsoft:Hyper-V:SubType:2" ;
113113
114114 if ( isGen2 )
115115 {
116+ // 确保 Reference 数组内容完整
116117 string [ ] newOrder = items . Select ( i => i . Reference . ToString ( ) ) . ToArray ( ) ;
117118 settings [ "BootSourceOrder" ] = newOrder ;
118- System . Diagnostics . Debug . WriteLine ( $ "[{ timestamp } ] [WMI-DEBUG] Gen2 路径总数: { newOrder . Length } , 第一项: { newOrder . FirstOrDefault ( ) } ") ;
119119 }
120120 else
121121 {
122122 ushort [ ] newOrder = items . Select ( i => Convert . ToUInt16 ( i . Reference ) ) . ToArray ( ) ;
123123 settings [ "BootOrder" ] = newOrder ;
124- System . Diagnostics . Debug . WriteLine ( $ "[{ timestamp } ] [WMI-DEBUG] Gen1 顺序: { string . Join ( "," , newOrder ) } ") ;
125124 }
126125
127126 using var vmSvc = GetManagementService ( ) ;
128127 using var inParams = vmSvc . GetMethodParameters ( "ModifySystemSettings" ) ;
128+
129+ // 🟢 关键:Hyper-V 极其依赖这个 XML 序列化格式来确认“这是整套配置更新”
129130 inParams [ "SystemSettings" ] = settings . GetText ( TextFormat . CimDtd20 ) ;
130131
131- // 计时开始
132- var watch = System . Diagnostics . Stopwatch . StartNew ( ) ;
133132 using var outParams = vmSvc . InvokeMethod ( "ModifySystemSettings" , inParams , null ) ;
134- watch . Stop ( ) ;
135-
136133 uint returnValue = ( uint ) outParams [ "ReturnValue" ] ;
137- System . Diagnostics . Debug . WriteLine ( $ "[{ timestamp } ] [WMI-RESULT] InvokeMethod 返回值: { returnValue } (耗时: { watch . ElapsedMilliseconds } ms)") ;
138134
139- if ( returnValue == 0 ) return true ;
140- if ( returnValue == 4096 )
141- {
142- string jobPath = outParams [ "Job" ] ? . ToString ( ) ;
143- System . Diagnostics . Debug . WriteLine ( $ "[{ timestamp } ] [WMI-JOB] 启动异步任务: { jobPath } ") ;
144- return WaitForJob ( jobPath ) ;
145- }
146-
147- return false ;
135+ if ( returnValue == 4096 ) return WaitForJob ( outParams [ "Job" ] ? . ToString ( ) ) ;
136+ return returnValue == 0 ;
148137 }
149138 catch ( Exception ex )
150139 {
151- System . Diagnostics . Debug . WriteLine ( $ "[{ timestamp } ] [ WMI-ERROR] 异常: { ex . Message } ") ;
140+ System . Diagnostics . Debug . WriteLine ( $ "[WMI-CRITICAL- ERROR] { ex . Message } ") ;
152141 return false ;
153142 }
154143 } ) ;
155144 }
156-
157145 private bool WaitForJob ( string jobPath )
158146 {
159147 if ( string . IsNullOrEmpty ( jobPath ) ) return false ;
0 commit comments