亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#的Process類調用第三方插件實現PDF文件轉SWF文件

2020-01-24 00:56:07
字體:
來源:轉載
供稿:網友

在項目開發過程中,有時會需要用到調用第三方程序實現本系統的某一些功能,例如本文中需要使用到的swftools插件,那么如何在程序中使用這個插件,并且該插件是如何將PDF文件轉化為SWF文件的呢?接下來就會做一個簡單的介紹。

在.NET平臺中,對C#提供了一個操作對本地和遠程的訪問進程,使能夠啟動和停止系統進程。這個類就是System.Diagnostics.Process,我們首先來了解一下該類。

一.解析System.Diagnostics.Process類

在C#中使用Process類可以提供對本地和遠程的訪問進程,使能夠啟動和停止系統進程,并且該類可以對系統進程進行管理。該類中的一些常用方法:Start() ,Kill(),WaitForExit()等方法;StartInfo,FileName,CreateNoWindow等屬性。

1.Start()方法:啟動(或重用)此 Process 組件的 StartInfo 屬性指定的進程資源,并將其與該組件關聯。如果啟動了進程資源,則為 true;如果沒有啟動新的進程資源(例如,如果重用了現有進程),則為 false。
具體介紹一下該方法的實現代碼:

 /// <devdoc>    ///  <para>     ///  <see cref='System.Diagnostics.Process'/>如果過程資源被重用而不是啟動,重用的進程與此相關聯<see cref ='System.Diagnostics.Process'/>零件。    ///  </para>        /// </devdoc>    [ResourceExposure(ResourceScope.None)]    [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)]     public bool Start() {      Close();       ProcessStartInfo startInfo = StartInfo;       if (startInfo.FileName.Length == 0)        throw new InvalidOperationException(SR.GetString(SR.FileNameMissing));       if (startInfo.UseShellExecute) {#if !FEATURE_PAL        return StartWithShellExecuteEx(startInfo); #else        throw new InvalidOperationException(SR.GetString(SR.net_perm_invalid_val, "StartInfo.UseShellExecute", true)); #endif // !FEATURE_PAL       } else {        return StartWithCreateProcess(startInfo);       }    }

2.Kill()方法:立即停止關聯的進程。Kill 強制終止進程,Kill 方法將異步執行。 在調用 Kill 方法后,請調用 WaitForExit 方法等待進程退出,或者檢查 HasExited 屬性以確定進程是否已經退出。
具體介紹一下該方法的實現代碼:

[ResourceExposure(ResourceScope.Machine)]     [ResourceConsumption(ResourceScope.Machine)]    public void Kill() {       SafeProcessHandle handle = null;      try {        handle = GetProcessHandle(NativeMethods.PROCESS_TERMINATE);        if (!NativeMethods.TerminateProcess(handle, -1))           throw new Win32Exception();      }       finally {         ReleaseProcessHandle(handle);      }     }
SafeProcessHandle GetProcessHandle(int access) {      return GetProcessHandle(access, true);     }    /// <devdoc>    /// 獲取進程的短期句柄,具有給定的訪問權限。     ///如果句柄存儲在當前進程對象中,則使用它。     ///注意,我們存儲在當前進程對象中的句柄將具有我們需要的所有訪問權限。    /// </devdoc>     /// <internalonly/>     [ResourceExposure(ResourceScope.None)]    [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)]     SafeProcessHandle GetProcessHandle(int access, bool throwIfExited) {      Debug.WriteLineIf(processTracing.TraceVerbose, "GetProcessHandle(access = 0x" + access.ToString("X8", CultureInfo.InvariantCulture) + ", throwIfExited = " + throwIfExited + ")");#if DEBUG      if (processTracing.TraceVerbose) {         StackFrame calledFrom = new StackTrace(true).GetFrame(0);        Debug.WriteLine("  called from " + calledFrom.GetFileName() + ", line " + calledFrom.GetFileLineNumber());       } #endif      if (haveProcessHandle) {         if (throwIfExited) {          //因為hasProcessHandle是true,我們知道我們有進程句柄           //打開時至少要有SYNCHRONIZE訪問,所以我們可以等待它           // zero timeout以查看進程是否已退出。          ProcessWaitHandle waitHandle = null;          try {             waitHandle = new ProcessWaitHandle(m_processHandle);             if (waitHandle.WaitOne(0, false)) {              if (haveProcessId)                 throw new InvalidOperationException(SR.GetString(SR.ProcessHasExited, processId.ToString(CultureInfo.CurrentCulture)));              else                throw new InvalidOperationException(SR.GetString(SR.ProcessHasExitedNoId));            }           }          finally {             if( waitHandle != null) {               waitHandle.Close();            }           }        }        return m_processHandle;      }       else {        EnsureState(State.HaveId | State.IsLocal);         SafeProcessHandle handle = SafeProcessHandle.InvalidHandle; #if !FEATURE_PAL        handle = ProcessManager.OpenProcess(processId, access, throwIfExited); #else        IntPtr pseudohandle = NativeMethods.GetCurrentProcess();        // Get a real handle        if (!NativeMethods.DuplicateHandle (new HandleRef(this, pseudohandle),                           new HandleRef(this, pseudohandle),                          new HandleRef(this, pseudohandle),                           out handle,                           0,                          false,                           NativeMethods.DUPLICATE_SAME_ACCESS |                          NativeMethods.DUPLICATE_CLOSE_SOURCE)) {          throw new Win32Exception();        } #endif // !FEATURE_PAL        if (throwIfExited && (access & NativeMethods.PROCESS_QUERY_INFORMATION) != 0) {           if (NativeMethods.GetExitCodeProcess(handle, out exitCode) && exitCode != NativeMethods.STILL_ACTIVE) {             throw new InvalidOperationException(SR.GetString(SR.ProcessHasExited, processId.ToString(CultureInfo.CurrentCulture)));          }         }        return handle;      }     }

3.WaitForExit()方法:指示<see cref ='System.Diagnostics.Process'/>組件等待指定的毫秒數,以使相關聯的進程退出。

具體介紹一下該方法的實現代碼:

public bool WaitForExit(int milliseconds) {       SafeProcessHandle handle = null;      bool exited;      ProcessWaitHandle processWaitHandle = null;       try {        handle = GetProcessHandle(NativeMethods.SYNCHRONIZE, false);        if (handle.IsInvalid) {          exited = true;         }        else {           processWaitHandle = new ProcessWaitHandle(handle);           if( processWaitHandle.WaitOne(milliseconds, false)) {            exited = true;             signaled = true;          }          else {            exited = false;             signaled = false;          }         }       }      finally {         if( processWaitHandle != null) {          processWaitHandle.Close();        }         // If we have a hard timeout, we cannot wait for the streams        if( output != null && milliseconds == -1) {           output.WaitUtilEOF();         }         if( error != null && milliseconds == -1) {          error.WaitUtilEOF();        }         ReleaseProcessHandle(handle);       }       if (exited && watchForExit) {         RaiseOnExited();      }            return exited;     }
internal ProcessWaitHandle( SafeProcessHandle processHandle): base() {      SafeWaitHandle waitHandle = null;       bool succeeded = NativeMethods.DuplicateHandle(        new HandleRef(this, NativeMethods.GetCurrentProcess()),         processHandle,         new HandleRef(this, NativeMethods.GetCurrentProcess()),        out waitHandle,         0,        false,        NativeMethods.DUPLICATE_SAME_ACCESS);       if (!succeeded) {        Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());       }       this.SafeWaitHandle = waitHandle;     }

4.StartInfo屬性:獲取或設置要傳遞給 Process 的 Start 方法的屬性。StartInfo 表示用于啟動進程的一組參數。 調用 Start 時,StartInfo 用于指定要啟動的進程。 唯一必須設置的 StartInfo 成員是 FileName 屬性。

具體介紹一下該方法的實現代碼:
 

 [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), MonitoringDescription(SR.ProcessStartInfo)]     public ProcessStartInfo StartInfo {      get {         if (startInfo == null) {           startInfo = new ProcessStartInfo(this);        }         return startInfo;      }      [ResourceExposure(ResourceScope.Machine)]      set {         if (value == null) {          throw new ArgumentNullException("value");         }         startInfo = value;      }     }

5.CreateNoWindow屬性:獲取或設置指示是否在新窗口中啟動該進程的值。

具體介紹一下該方法的實現代碼:

[    DefaultValue(false),    MonitoringDescription(SR.ProcessCreateNoWindow),    NotifyParentProperty(true)     ]    public bool CreateNoWindow {       get { return createNoWindow; }       set { createNoWindow = value; }    }

 以上簡單介紹了該類的三種常用方法和兩種常用屬性,在實際的開發項目中無須對每個屬性方法和屬性的底層實現做全面的了解,但建議在學習該類的時候,適當的了解一下某一些類的方法實現,有助于我們很好的掌握該類。

二.如何實現PDF文件轉化為SWF文件

在項目如果需要將PDF文件轉換為SWF文件,可以在項目中引入Swftools插件,該插件的主要功能:PDF到SWF轉換器。 每頁生成一幀。 使您能夠在Flash Movie中擁有完全格式化的文本,包括表格,公式,圖形等。 它基于Derek B. Noonburg的xpdf PDF解析器。

簡單介紹一下該插件的常用參數:

-h , 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

亚洲国产美女精品久久久久∴| 国产精品美女免费看| 久久深夜福利免费观看| 亚洲成人免费在线视频| 国产精品在线看| 国产xxx69麻豆国语对白| 亚洲第一天堂无码专区| 2019中文字幕全在线观看| 欧美视频不卡中文| 日韩精品在线免费观看视频| 久久久久久久久久久亚洲| 欧美日韩国产二区| 国产欧美亚洲视频| 久久亚洲精品网站| 亚洲欧美综合另类中字| 国产精品亚洲第一区| 久久久久www| 日韩电影在线观看中文字幕| 伊人精品在线观看| 欧美精品在线观看91| www.欧美精品| 欧美极品在线视频| 久久久久久久久久久久久久久久久久av| 久久久欧美精品| 欧美在线欧美在线| 国产精品天天狠天天看| 亚洲色图色老头| 久久久久久久久久久久av| 欧美老肥婆性猛交视频| 亚洲精品mp4| 欧美丰满片xxx777| 日韩欧美中文字幕在线播放| 一区二区亚洲精品国产| 欧洲日本亚洲国产区| 亚洲成人中文字幕| 国产一区二区三区免费视频| 久久免费视频网| 午夜精品久久久久久久白皮肤| 国产一区二区欧美日韩| 伊人久久男人天堂| 日韩高清人体午夜| 日本欧美一级片| 欧美老女人在线视频| 国内成人精品视频| 久久精品国产69国产精品亚洲| 欧美日韩一区二区三区| 精品久久久久久久久久国产| 国产精品mp4| 在线精品播放av| 亚洲香蕉伊综合在人在线视看| 热久久免费视频精品| 亚洲国产精品嫩草影院久久| 国产精品视频99| 一区二区三区亚洲| 成人女保姆的销魂服务| 亚洲自拍偷拍一区| 97在线视频观看| 91视频88av| 欧美一区二区视频97| 国产精品久久久久久久久| 欧美一级bbbbb性bbbb喷潮片| 欧美成人精品在线视频| 7m第一福利500精品视频| 久久6精品影院| 91亚洲永久免费精品| 日韩欧美有码在线| 国产精品久久久一区| 美女视频黄免费的亚洲男人天堂| 国产亚洲a∨片在线观看| 在线免费看av不卡| 亚洲欧美一区二区三区在线| 在线观看亚洲视频| 欧美日韩亚洲精品一区二区三区| 欧美另类交人妖| 欧美日韩激情网| 欧美寡妇偷汉性猛交| 美女久久久久久久| 亚洲欧洲中文天堂| 亚洲欧美激情视频| 国产成人亚洲精品| 国产精品久久久久91| 成人精品网站在线观看| 国产成人免费91av在线| 成人两性免费视频| 热久久美女精品天天吊色| 欧美国产亚洲精品久久久8v| 亚洲视频免费一区| 在线看福利67194| 国产自产女人91一区在线观看| 亚洲精品自拍偷拍| 日韩女优在线播放| 26uuu国产精品视频| 黑人精品xxx一区一二区| 成人免费看片视频| 欧洲亚洲女同hd| 国产精品第七十二页| 91免费精品国偷自产在线| 亚洲国产成人精品久久| 欧美日韩精品在线视频| 日日骚久久av| 亚洲天天在线日亚洲洲精| 久久精品国产成人| 色偷偷偷综合中文字幕;dd| 久久久久久久久久久网站| 中文字幕亚洲欧美一区二区三区| 欧美日韩人人澡狠狠躁视频| 亚洲成色www8888| 成人av电影天堂| 亚洲精品视频在线观看视频| 欧美午夜电影在线| 在线中文字幕日韩| 亚洲四色影视在线观看| 日本亚洲欧美成人| 久久九九有精品国产23| 日韩在线观看成人| 国产精品高潮呻吟久久av黑人| 亚洲精品一区二区网址| 国产精品白丝jk喷水视频一区| 不用播放器成人网| 中国日韩欧美久久久久久久久| 欧美老少配视频| 69**夜色精品国产69乱| 国产乱肥老妇国产一区二| 亚洲va欧美va国产综合剧情| 国产日韩欧美一二三区| 91精品国产综合久久香蕉的用户体验| 68精品国产免费久久久久久婷婷| 91人人爽人人爽人人精88v| 国产亚洲一区二区精品| 欧美理论电影在线观看| 欧美午夜精品久久久久久久| 亚洲成人精品av| 日韩在线观看网站| 伊人成人开心激情综合网| 国产亚洲精品va在线观看| 国产精品免费久久久| 日韩av免费在线| 91av在线免费观看视频| 亚洲综合日韩中文字幕v在线| 亚洲永久在线观看| 亚洲第一天堂无码专区| 欧美疯狂做受xxxx高潮| 亚洲精品自拍偷拍| 国产精品视频在线播放| 九九热在线精品视频| 国产91亚洲精品| 日韩在线高清视频| 久久国产精品久久久久| 久久亚洲精品网站| 69久久夜色精品国产69| 久久久久久久影院| 精品久久久久人成| 国产精品女人网站| 日韩精品亚洲元码| 欧美性猛交视频| 日韩禁在线播放| 红桃视频成人在线观看| 91免费人成网站在线观看18| 欧美一级视频免费在线观看| 国产婷婷色综合av蜜臀av| 亚洲精选在线观看| 国产欧美亚洲视频| 久久这里只有精品视频首页| 欧美激情亚洲国产|