2020年10月25日日曜日

MSIX化その2

<コマンドラインを使う>

 はまりました。VisualStudio上の「公開」を行うと、C#系は、DLL郡をきっちりアタッチしてくれるのですが、C++系プロジェクトについては、EXEだけで、読み込んでいるDLLをアタッチしてくれません。どうにも方法が分からなかったのですが、「公開」+コマンドラインで構築していくことで、必要なファイルをアタッチすることができました。

具体的には、makeappx コマンドとsigntool コマンドを次のようにコンソール上で動かします。最終的には、msixbundleというフォルダが出来ますが、これは、xx_bundleというフォルダに集められたサイニングしたmsixの集合体を指しているようです。最終的に、msibundleにもサイニングして完成になります。


makeappx pack /l /h sha256 /m "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\ForBundle\AppxManifest.xml" /f obj\x64\Release\main_map_tak.txt /o /p "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_x64.msix"
signtool.exe sign /fd sha256 /a "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_x64.msix"
makeappx pack /r /l /h sha256 /m "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\ForBundle\AppxManifest.xml" /f obj\x64\Release\split.scale-100.map.txt /o /p "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_scale-100.msix"  
signtool.exe sign /fd sha256 /a "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\ForBundle\AppxManifest.xml" /f obj\x64\Release\split.scale-100.map.txt /o /p "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_scale-100.msix"  
makeappx pack /r /l /h sha256 /m "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\ForBundle\AppxManifest.xml" /f obj\x64\Release\split.scale-125.map.txt /o /p "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_scale-125.msix"
signtool.exe sign /fd sha256 /a "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\ForBundle\AppxManifest.xml" /f obj\x64\Release\split.scale-125.map.txt /o /p "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_scale-125.msix"
makeappx pack /r /l /h sha256 /m "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\ForBundle\AppxManifest.xml" /f obj\x64\Release\split.scale-150.map.txt /o /p "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_scale-150.msix"  
signtool.exe sign /fd sha256 /a "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\ForBundle\AppxManifest.xml" /f obj\x64\Release\split.scale-150.map.txt /o /p "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_scale-150.msix"  
makeappx pack /r /l /h sha256 /m "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\ForBundle\AppxManifest.xml" /f obj\x64\Release\split.scale-400.map.txt /o /p "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_scale-400.msix"
signtool.exe sign /fd sha256 /a "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\ForBundle\AppxManifest.xml" /f obj\x64\Release\split.scale-400.map.txt /o /p "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_scale-400.msix"

copy "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_x64.msix" obj\x64\Release\WapProjTemplate1_1.0.30.0_Bundle\*.*
copy "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_scale-100.msix" obj\x64\Release\WapProjTemplate1_1.0.30.0_Bundle\*.*
copy "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_scale-125.msix" obj\x64\Release\WapProjTemplate1_1.0.30.0_Bundle\*.*
copy "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_scale-150.msix" obj\x64\Release\WapProjTemplate1_1.0.30.0_Bundle\*.*
copy "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\bin\x64\Release\WapProjTemplate1_1.0.30.0_scale-400.msix" obj\x64\Release\WapProjTemplate1_1.0.30.0_Bundle\*.*
 
makeappx bundle /d obj\x64\Release\WapProjTemplate1_1.0.30.0_Bundle\ /bv 1.0.30.0 /o /p "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\AppPackages\WapProjTemplate1_1.0.30.0_Test\WapProjTemplate1_1.0.30.0_x64.msixbundle"  
signtool.exe sign /fd sha256 /a "C:\Users\sugaw\Documents\Visual Studio 2019\Projects\schedule_nurse_ver3\WindowsFormsApplication1\WapProjTemplate1\WapProjTemplate1\AppPackages\WapProjTemplate1_1.0.30.0_Test\WapProjTemplate1_1.0.30.0_x64.msixbundle"  

最初のmakeappx で、/f obj\x64\Release\main_map_tak.txt を行っているのがミソで、オリジナルのmain_map.txtから変更しています。 https://stackoverflow.com/questions/47586254/what-are-mapping-files-for-building-against-uwp-centennial-projects-and-how-do


また、VisualStudio上のプロジェクトだけではなく、スケジュールナース上のサンプルフォルダについても、同様にmapping fileで記述することになります。サンプルフォルダは、いくつかの階層になっていて、ファイル数も多いし、今後のバージョンでも変わっていくので、プロジェクトフォルダ内のファイルをファイルに書き出すプログラムをつくりました。 

using System;
using System.IO;
using System.Text;

namespace ConsoleApp1
{
    class Program
    {
        private static void DirectoryDisplay(StreamWriter w,string sourceDirName,string subname="")
        {
            // Get the subdirectories for the specified directory.
            
            
            DirectoryInfo dir = new DirectoryInfo(sourceDirName);
            //Directory.SetCurrentDirectory(ss2);

            if (!dir.Exists)
            {
                throw new DirectoryNotFoundException(
                    "Source directory does not exist or could not be found: "
                    + sourceDirName);
            }

            DirectoryInfo[] dirs = dir.GetDirectories();

           

            // Get the files in the directory and copy them to the new location.
            FileInfo[] files = dir.GetFiles();
            foreach (FileInfo file in files)
            {
                string s = "\"" + file.FullName + "\" " + "\""+subname+"\\"+file.Name+"\"";
                w.WriteLine(s);
                
            }

            // If copying subdirectories, copy them and their contents to new location.
            
            {
                foreach (DirectoryInfo subdir in dirs)
                {
                    
                    DirectoryDisplay(w,subdir.FullName,subname+"\\"+subdir.Name);
                }
            }
        }


        static void Main(string[] args)
        {
            if (args.Length <= 0) return;
            string dir=args[0];
            var utf8_encoding = Encoding.GetEncoding("utf-8");

            StreamWriter w = new StreamWriter("test.txt",false,utf8_encoding);
            string ss = Directory.GetCurrentDirectory();
            string ss2 = Path.Combine(ss, "..\\");
            string ss3 = Path.Combine(ss2, dir);
            DirectoryDisplay(w,ss3, dir);
            Console.WriteLine("Hello World!");
        }

    }
}
 

スケジュールナースが起動したとき、defaultのインストールフォルダ内に、"プロジェクトサンプル"がないときは、プログラムの実行パスを基点としたプロジェクトサンプルフォルダの内容をコピーするようにしています。

以上で、証明書以外のMSIX化が可能になりました。

<TIPS> MSIX化したパッケージフォルダは、C:Program Files\WindowsApps内にありますが、アクセス権限が強いのか見ることができません。なので、丸ごとWindowsAppsの内容をコピーして、サンプルフォルダ等のアタッチするべきファイルがアタッチされているか、確認しています。

0 件のコメント:

コメントを投稿