我正在尝试在C#中复制以下PowerShell:
# Details from here are not particularly important but needed for full sample
$vms = gwmi -namespace "root\virtualization\v2" Msvm_ComputerSystem
$vm = $vms[3]
$snapshot = ($vm.GetRelated("Msvm_VirtualSystemSettingData") | Where { $_.ElementName -eq "SnapshotName" })[0]
# end unimportant
$VMSS = Get-WMiObject -class Msvm_VirtualSystemSnapshotService -namespace root\virtualization\v2
$VMSS.ApplySnapshot($snapshot, $null)
此代码工作正常 - 快照按预期应用。
我在C#中获取Msvm_VirtualSystemSettingData
实例或Msvm_VirtualSystemSnapshostService
实例没有问题。但是,我似乎无法接听ApplySnapshot
的权利 - 无论我给它什么,我都会InvalidOperationException
。我正在使用Visual Studio生成的WMI代码进行调用:
public uint ApplySnapshot(ref System.Management.ManagementPath Job, System.Management.ManagementPath Snapshot) {
if ((isEmbedded == false)) {
System.Management.ManagementBaseObject inParams = null;
inParams = PrivateLateBoundObject.GetMethodParameters("ApplySnapshot");
// following line has been through variations as well with no change -
// commenting it out, setting to null
inParams["Job"] = ((System.Management.ManagementPath)(Job)).Path;
inParams["Snapshot"] = ((System.Management.ManagementPath)(Snapshot)).Path;
System.Management.ManagementBaseObject outParams = PrivateLateBoundObject.InvokeMethod("ApplySnapshot", inParams, null);
Job = ((System.Management.ManagementPath)(outParams.Properties["Job"].Value));
return System.Convert.ToUInt32(outParams.Properties["ReturnValue"].Value);
}
else {
return System.Convert.ToUInt32(0);
}
}
我不确定要为Job
参数传递什么,因为我们找回了一份工作 - 为ref
而不是out
提供null
非常不寻常我已经尝试了很多不同的变体(包括将参数设置为inParams[Job]
而不是设置它)没有运气。我也尝试将null
设置为{{1}}而没有运气。
我应该做些什么来改变它?
答案 0 :(得分:2)
我相信你的问题是,当你是一个出站参数时,你正在传递工作。该参数将从调用返回。像...这样的东西。
ManagementBaseObject inParams = null;
inParams = PrivateLateBoundObject.GetMethodParameters("ApplySnapshot");
inParams["Snapshot"] = ((System.Management.ManagementPath)(Snapshot)).Path;
ManagementBaseObject outParams = PrivateLateBoundObject.InvokeMethod("ApplySnapshot", inParams, null);
// i left this as i assume this is vs generated though this isn't how i would normally
// get my jobs back.
Job = ((ManagementPath)(outParams.Properties["Job"].Value));
return Convert.ToUInt32(outParams.Properties["ReturnValue"].Value);