2017-07-13 46 views
1

すべてのファイル/リソースを1つのexe(2つのexeとps1)に埋め込みたいすべてのファイルを1つのexeファイルに埋め込む

可能ですか?私はプロジェクトを公開することができましたが、追加のファイル(アプリケーションファイル、アプリケーションマニフェスト、セットアップexe)が出力にあります。これは、単一のexeファイルに組み込みたいものです。

私はリソースを埋め込む必要があり、おそらくポインタを作成する必要があるかもしれないと思われます。または、私は正しい軌道に乗っていますかどうかわからない、および/またはコードを開始する方法..プロジェクト内の画像リソースを埋め込むこと

私が持っているもの

これまで

private Boolean Install_certificate() 
{ 
    try 
    { 
     var newProcessInfo = new System.Diagnostics.ProcessStartInfo() 
     { 
      FileName = @"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe", 
      Verb = "runas", 
      Arguments = (@"–ExecutionPolicy Bypass ""script.ps1""") 

     }; 
     System.Diagnostics.Process.Start(newProcessInfo); 


     // Install the cert & change proxy settings 
     //System.Diagnostics.Process.Start(@"script.ps1"); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 
private Boolean Install_exe1() 
{ 
    try 
    { 
     // Install exe1 
     System.Diagnostics.Process.Start(@"setup1.exe"); 

     return true; 

    } 
    catch 
    { 
     return false; 
    } 
} 
private Boolean Install_exe2() 
{ 
    try 
    { 
     // Install exe2 
     System.Diagnostics.Process.Start(@"setup2.exe"); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 

は助けに感謝します!

おかげ

答えて

1

あなたは.exeファイルを起動するためにSystem.Diagnostics.Processを使用することができます。

System.Management.Automationを使用して、パワーシェルスクリプトを実行できます。

あなたのEXEファイルは、コマンド・プロンプトからそれらの依存関係を扱う場合、あなたのC#のプロジェクトにこれらのファイルを埋め込みたい場合は、C#

に問題があってはなりません、あなたはadd them as resourcesことができ、あなたのプログラムが実行されるときに保存することができますバイナリコンテンツをexeファイルにコピーして実行してください:

簡単に言えば、プロジェクトを右クリックし、プロパティを選択してからリソースをクリックしてください。このリンクをクリックすると、デフォルトのリソースファイルがプロジェクトに追加されます。

リソースデザイナーでファイルを選択し、リソースを追加して埋め込むファイルを追加します。これにより、アプリケーションにbyte[]としてアクセスできるファイルが埋め込まれたResourcesファイルが作成されます。

enter image description here

次に、あなたのアプリケーションは、ディスクに保存し、それらを実行して起動したとき:

using System; 
using System.IO; 
using System.Diagnostics; 
namespace myNs 
{ 

    class Program 
    { 
     static void unpack() 
     { 
      if (!File.Exists("exe1.exe")) 
       File.WriteAllBytes("exe1.exe", myNs.Properties.Resources.exe1); 
      if (!File.Exists("exe2.exe")) 
       File.WriteAllBytes("exe2.exe", myNs.Properties.Resources.exe2); 
      if (!File.Exists("ps1.ps")) if (!File.Exists("ps1.ps")) 
        File.WriteAllBytes("ps1.ps", myNs.Properties.Resources.ps1); 
     } 
     static void Main(string[] args) 
     { 
      unpack(); 
      Process process = new Process(); 
      process.StartInfo.FileName = "exe1.exe"; 
      process.Start(); 
      process.WaitForExit(); 

      process = new Process(); 
      process.StartInfo.FileName = "exe2.exe"; 
      process.Start(); 
      process.WaitForExit(); 

      process = new Process(); 
      process.StartInfo.FileName = @"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"; 
      process.StartInfo.Arguments = "ps1.ps1"; 
      process.Start(); 
      process.WaitForExit(); 
     } 
    } 
} 
+0

はい私はSystem.Diagnostics.ProcessとSystem.Management.Automationを使用しています。私の質問は、exeの+ powershellを追加ファイルなしの単一のexeファイルにコンパイルすることに関するものです。 – Hex02

+0

追加の質問や問題がありますか?私はあなたがそれを達成する方法に答え、タスクを達成するためにコードを使用する方法へのリンクを掲載しました。異なるexeを一つのexeにコンパイルすることは、それらを一つのexeから実行するのと同じではありません。 –

+0

単一のexeからそれらを実行する - それは質問/タスクです – Hex02

0

私の質問には、追加のファイル

せずに、単一のexeファイルへのPowerShell + exeファイルのコンパイルに関するさ

Alexander Higginsのように、ps1スクリプトをリソースとして追加できます。

MicrosoftのツールILMergeを使用して、2つのアセンブリを結合することができます。ここでは、Primary.dllSecondary.dll(など)をMerged.dllにマージし、log.txtをマージします。

ilmerge /log:log.txt /out:Merged.dll Primary.dll Secondary.dll 

のEXEはあなたがmegre 2つのEXEファイルをカントのエントリポイントを持っているので、これを回避するためには、単にDLL(クラスライブラリ)であることをEXEファイルの1つを変更。

+0

申し訳ありませんが私はかなりあなたの提案を理解していない、どのようなDLLにexeを変更するの使用ですか? – Hex02

+0

投稿したリンクの詳細セクションを読む*入力アセンブリのリストの最初のアセンブリがプライマリアセンブリです。プライマリアセンブリが実行可能ファイルである場合、ターゲットアセンブリは、プライマリアセンブリと同じエントリポイントを持つ実行可能ファイルとして作成されます。*つまり、 'Main()'が1つしかないため、> 1のexeを持つことはできません。 –

関連する問題