internal static MI_Deserializer.MI_Deserializer_ClassObjectNeededNative GetNativeClassObjectNeededCallback(string format, MI_Deserializer.MI_Deserializer_ClassObjectNeeded managedCallback) { if (managedCallback == null) { return(null); } return(delegate( IntPtr context, IntPtr serverNamePtr, IntPtr namespaceNamePtr, IntPtr classNamePtr, IntPtr requestedClassObject) { MI_String serverName = MI_String.NewFromDirectPtr(serverNamePtr); MI_String namespaceName = MI_String.NewFromDirectPtr(namespaceNamePtr); MI_String className = MI_String.NewFromDirectPtr(classNamePtr); MI_Class classObject; try { var localResult = managedCallback(serverName.Value, namespaceName.Value, className.Value, out classObject); if (localResult == MI_Result.MI_RESULT_OK) { IntPtr outPtr; if (MI_SerializationFormat.MOF.Equals(format, StringComparison.OrdinalIgnoreCase)) { // The MOF deserializer helpfully tries to manage the class objects returned by the // callback and will cheerfully delete them without warning. Return a copy instead. MI_Class tmp; localResult = classObject.Clone(out tmp); if (localResult != MI_Result.MI_RESULT_OK) { return localResult; } outPtr = tmp.Ptr; } else { outPtr = classObject.Ptr; } Marshal.WriteIntPtr(requestedClassObject, outPtr); } return localResult; } catch { return MI_Result.MI_RESULT_FAILED; } }); }