private void InternalWriteEvent(uint eventID, ushort category, EventLogEntryType type, string[] strings, byte[] rawData, string currentMachineName) { if (strings == null) strings = new string[0]; if (strings.Length >= 0x100) throw new ArgumentException(SR.GetString("TooManyReplacementStrings")); for (int i = 0; i < strings.Length; i++) { if (strings[i] == null) strings[i] = string.Empty; if (strings[i].Length > 0x7ffe) throw new ArgumentException(SR.GetString("LogEntryTooLong")); } if (rawData == null) rawData = new byte[0]; if (this.Source.Length == 0) throw new ArgumentException(SR.GetString("NeedSourceToWrite")); if (!this.IsOpenForWrite) this.OpenForWrite(currentMachineName); IntPtr[] ptrArray = new IntPtr[strings.Length]; GCHandle[] handleArray = new GCHandle[strings.Length]; GCHandle handle = GCHandle.Alloc(ptrArray, GCHandleType.Pinned); try { for (int j = 0; j < strings.Length; j++) { handleArray[j] = GCHandle.Alloc(strings[j], GCHandleType.Pinned); ptrArray[j] = handleArray[j].AddrOfPinnedObject(); } byte[] userSID = null; if (!UnsafeNativeMethods.ReportEvent(this.writeHandle, (short) type, category, eventID, userSID, (short) strings.Length, rawData.Length, new HandleRef(this, handle.AddrOfPinnedObject()), rawData)) throw SharedUtils.CreateSafeWin32Exception(); } finally { for (int k = 0; k < strings.Length; k++) { if (handleArray[k].IsAllocated) handleArray[k].Free(); } handle.Free(); } } 如果不喜欢GC的自动垃圾回收,可以试试这种方式,说不定效果更好. | |||||||
posted @ 2011-12-02 16:22 DataFlow 阅读(7) 评论(0) 编辑

