41583


タイトルの件、exe形式のWindows Formであれば、Process.startで別プロセスで  
起動できると思いますが、DLL内の特定Formクラスを別プロセスで起動する  
方法はありますでしょうか？

ランチャ(exe)を別途用意して、Process.start(ランチャ.exe)を  
実行し、ランチャ内でDLL内の特定のFormをリフレクションで作成して  
起動する方法は、問題ないことを確認しておりますが、  
ランチャを経由せずに起動する方法を探しております。

このあたり、ご存知の方がおりましたら  
ご教示頂きたく、よろしくお願いいたします。


CC BY-SA 3.0
2018-02-08T09:47:12.117
41582
2018-02-08T11:49:24.650
9228
question
c# winforms
C# DLL（クラスライブラリ）内のWindows Formを別プロセスで起動できますか？


そもそもプロセスの生成とは特定の実行可能ファイルを指定した引数や権限で開始することを指すわけですから、なんらかの実行可能ファイル＝「ランチャ」は必ず必要になります。

また実行ファイルのエントリポイント(`Program.Main`)は事前に定義する必要があり、プロセス外から変更することはできません。一般的には実行される側のプロセスがあらかじめコマンドライン引数などを参照しておき、他プロセスは引数を変えることで動作を変更する形になります。

ですので選択肢としては

  1. 起動対象のフォームを含むソリューション側であらかじめ特殊な起動オプションを用意しておく

たとえば

[code]

    static void Main(string[] args)
    {
        // 略
        Application.Run(new MainForm());
    }
    
[/code]

となっているところを

[code]

    static void Main(string[] args)
    {
        // 略
        if (args.Contains("/hoge"))
        {
            Application.Run(new HogeForm());
            return;
        }
        Application.Run(new MainForm());
    }
    
[/code]

のように起動処理を変えれば良いです。

  2. 任意のフォーム型を引数に取りリフレクションで生成するアプリケーションを用意しておく
  3. 動的コード生成を用いて要件にあったエントリポイントを含むアセンブリを実行時に出力する

ぐらいになるかと思います。

留意事項を挙げておくと.NETアプリケーションの構成はかなりの部分app.configに依存しています。ですので起動する実行可能ファイルを変えると参照アセンブリの解決などがうまく行かなくなる可能性も高いため、単純にリフレクションを使えばよいというものではありません。出来る限り呼び出される側で特殊な起動方法に対応する形にすべきだと思います。


CC BY-SA 3.0
2018-02-08T10:30:25.953
41583
2018-02-08T10:30:25.953
5750
41582
answer


kunifさんも言及されていますが、ランチャー画面に表示を行わないFormにリンクを行うのは無駄ですのでお勧めできません。  
とはいえ、質問に対してはお勧めのアプローチがあるので紹介します。

C#プロジェクトは次の３種類があります。

  * Console Application  
コンソール（コマンドプロンプトの黒あれ）を表示する.EXE

  * Windows Application  
コンソールを表示しない.EXE

  * Class Library  
コンソールを表示しない.DLL

ネイティブの.EXE / .DLLと異なり.NETの.EXE /
.DLLでは上記の差しかありません。つまり、.EXE形式であってもリンク（参照）することができます。（ネイティブではリンクを行うためには.DLLの必要があります。）

ですので、独立したプロセスとして起動したいFormはClass Library(.DLL)でなくWindows
Application(.EXE)としてMainメソッドも用意しておき、ランチャープログラムからはこの.EXEを参照するとよいでしょう。


CC BY-SA 3.0
2018-02-08T11:49:24.650
41587
2018-02-08T11:49:24.650
4236
41582
answer