程式產生器 : 圖片目錄轉為資源組件(DLL)

  • 2377
  • 0

程式產生器 : 圖片目錄轉為資源組件(DLL)

在 WPF 專案中,動畫會大量使用圖片檔案,預設圖片會直接與原本的專案合併,一來導致產生的組件檔案過大,二則程式邏輯與圖片檔案維護分工不易,日後任一更動,整個組件就得重新封裝。

WPF 程式與圖檔關連,開發時可以選擇幾種不同分式

  • 程式與圖檔合併產生一個組件 (Visual Studio 與 Blend 預設採用)
  • 程式產生組件,圖檔儲存於本機的實體檔案目錄中
  • 程式與圖檔分別產生為不同組件

 

筆者在日前專案上原本採上述第二種方式,不料專案後期需要調整為第三種方式。

手動的操作步驟如下:

Visual Studio 新增一個類別專案,將圖檔拖曳至專案中,在將其設定為 [Resource],
建置就可以得到一個DLL檔。

這種手動作法並不會麻煩。

但專案已開發很多模組,累計總圖檔已達 300 多 MB,決定區分模組分別建立資源組件,計算須要手動建立 50 個專案,再重複相同的步驟。

 

最後決定寫出本範例,自動產生專案與DLL檔,程序如下:

  1. 在介面上指定 一個/多個 圖檔目錄
  2. 新增一個類別專案
  3. 加入指定目錄的圖檔至專案中
  4. 自動建置成 DLL

 

開發技巧

如何產生專案

手動新專案後,將 AssemblyInfo.cs , *.csproj 兩個檔案加入專案,並設定為: 內嵌資源

image

以下語法可以在程序中讀取檔案內容文字。


        /// <summary>
        /// 讀取這個專案的文件範本,檔案儲存於TempleteDoc下,並設定為:內嵌資源
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public string GetConfigText(string fileName)
        {
            using (Stream stream = Assembly.GetExecutingAssembly()
                               .GetManifestResourceStream("GeneratorResourceProject.TempleteDoc." + fileName))
            using (StreamReader reader = new StreamReader(stream))
            {
                string result = reader.ReadToEnd();
                return result;
            }
        }

在將部份內容取代,例如:

AssemblyInfo.cs 中 Assembly Guid

*csproj 中的: ProjectGuid, 圖檔名稱等 ...

 

如何建置專案(Compile)

若專案的資訊都設定好,透過 Engine Class 可以自接產生DLL,若採用 MSBuild 指令會麻煩一點 (筆者沒試成功)。


        private void BuildAssembly(string outputDir, string outFileName, string rootNamespace)
        {
            string releaseDir = Path.Combine(outputDir, "Release");
            if (!Directory.Exists(releaseDir))
                Directory.CreateDirectory(releaseDir);

            string projectFile = Path.Combine(outputDir, string.Format("{0}\\{0}.csproj", outFileName));

            Engine engine = new Engine();

            // Point to the path that contains the .NET Framework 2.0 CLR and tools
            engine.BinPath = @"C:\Windows\Microsoft.NET\Framework64\v4.0.30319";

            // Instantiate a new FileLogger to generate build log
            FileLogger logger = new FileLogger();

            // Set the logfile parameter to indicate the log destination
            logger.Parameters = string.Format(@"logfile={0}", Path.Combine(outputDir, "build.log"));

            // Register the logger with the engine
            engine.RegisterLogger(logger);

            // Build a project file 
            bool success = engine.BuildProjectFile(projectFile);

            //Unregister all loggers to close the log file
            engine.UnregisterAllLoggers();

            //刪除 pdb 檔案
            System.IO.File.Delete(Path.Combine(outputDir, "Release", rootNamespace + ".pdb"));
        }

 

執行與測試

主要畫面

SNAGHTML15ad8d

 

測試使用資源檔案

建立一個WPF專案,參考剛產生的DLL檔,

在 <Image> Source 屬性設定如下:

Source="pack://application:,,,/MyProject.Monkey.Resources;component/Images/monkey_brownStand00.png"

即可呈現圖片

image

 

範例檔案

下載路徑: https://dotblogsfile.blob.core.windows.net/user/robin/1303/20133239439367.zip