C#は管理されたdllをexeファイルに埋め込みます



C Embed Managed Dll Into Exe File



vs2017を使用してC#でWinFormアプレットを作成すると、接続がプログラムで使用されますMySqlJson文字列を処理するMySql.Data.dllとNewtonsoft.Json.dllは2つのdllです。彼らは、小さなプログラムがリリースされたときに非常に多くのdllを添付する必要があるという事実に苦しんでいます。参考記事

https://blog.csdn.net/lin381825673/article/details/39122257



https://blog.csdn.net/call_me_lzm/article/details/51501620

exeファイルにdllを埋め込みます。ソリューションは次のように要約されます。



  1. ILMergeなどのツールを使用してdllをexeファイルに埋め込む
  2. exeファイルにdllを埋め込み、最初に実行したときにリリースします
  3. dllはexeファイルに埋め込まれており、dllを使用すると、メモリに読み込まれます。

1の場合、予備的な理解の後、exeが生成された後、dllがツールを介して埋め込まれる必要があります。このように、プログラムを変更するたびにこの操作を繰り返す必要があり、煩わしすぎるので、直接スキップして他の解決策を探してください(もちろん、私の理解不足や理解している学生による誤解かもしれません) )2については、配布時に1つのexeファイルしかリリースされないことは満足できますが、実行すると大量のdllがスローされ、それでも不快に見えます。3は計画です。採用されました。これについては、以下で詳しく説明します。

1.2つのdllをプロジェクトに導入する必要があります(そうでない場合、コードはコンパイルされません)、dllファイルも必要です(実行時に呼び出す必要があります)。 (このステップはすでに実行されている可能性があります。次の2つのステップを確認してください)




次に、Resources.resxをダブルクリックし、既存のファイルを追加することを選択し、必要なDLLを追加します


あなたは今もっと見ることができます


三、AssemblyResolve処理関数を追加します

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { string dllName = args.Name.Contains(',') ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace('.dll', '') dllName = dllName.Replace('.', '_') if (dllName.EndsWith('_resources')) return null System.Resources.ResourceManager rm = new System.Resources.ResourceManager(GetType().Namespace + '.Properties.Resources', System.Reflection.Assembly.GetExecutingAssembly()) byte[] bytes = (byte[])rm.GetObject(dllName) return System.Reflection.Assembly.Load(bytes) } public Form1()//Look clearly that this is the original initialization function of the form { //Called before InitializeComponent() AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve) InitializeComponent() }

CurrentDomain_AssemblyResolveにブレークポイントを設定して表示できます。プログラムが初めて呼び出されたときに、ブレークポイントが表示されます。MySql.Data.dllまたは、Newtonsoft.Json.dllのメソッドがこの関数をコールバックします。また、exeファイルを生成した後、dllファイルを削除してexeを単独で実行すると、dllが見つからないというエラーが報告されなくなります。dllがメモリにロードされると、それは常に存在します。したがって、dllが初めて見つからない場合にのみロードされ、それ以外の場合は使用されません。

実験中に発生した問題、2番目のステップでリソースを追加するときは、Newtonsoft.Json.dllは関係なく追加されますMySql.Data.dll、プログラムがリリースされたときdllは引き続きエラーを報告します。長時間デバッグした後、成功するためにすべてのdllがリソースに追加されます!