他の DLL に外部依存する DLL を配布しています。DLL が欠落したり、さまざまな状況が混在したりする危険を冒すのではなく、独自の DLL/EXE 内に DLL を埋め込み、実行時にそれをロードしてランタイム リンクを満たします。
質問:
A) 間
- DLL を .EXE/.DLL 内に埋め込み、実行時にメモリにロードして、
- DLL をファイル システム上に別のファイルとして保持し、システムにそれをロードさせる
どちらのアプローチがより多くのメモリを消費し、おおよそどのくらい消費しますか?
B)上記よりも優れたアプローチを持っている人はいますか?特に、以下の詳細の項目 #3 について。
興味のある方向けのプロセスの詳細:
アセンブリ内のコードが呼び出される前に実行されることがわかっている部分 (例: 初期化時間) で AssemblyResolve イベントに登録します。
public void SomeInitCode() { ... AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { string[] assemblyDetail = args.Name.Split(','); var assemblyName= assemblyDetail[0] + ".dll"; var thisAssembly = Assembly.GetExecutingAssembly(); var allResourceNames = thisAssembly.GetManifestResourceNames(); string requiredResName = allResourceNames.SingleOrDefault(a => a.EndsWith(assemblyName)); using (var input = thisAssembly.GetManifestResourceStream(requiredResName)) { return input != null ? Assembly.Load(StreamToBytes(input)) : null; } }; ... } static byte[] StreamToBytes(Stream input) { var capacity = input.CanSeek ? (int)input.Length : 0; using (var output = new MemoryStream(capacity)) { int readLength; var buffer = new byte[4096]; do { readLength = input.Read(buffer, 0, buffer.Length); output.Write(buffer, 0, readLength); } while (readLength != 0); return output.ToArray(); } }
アセンブリを埋め込みます。これは、.NET プロジェクトに「既存のアイテムを追加」することによって行われます => .dll を選択 => OK。戻って.dllを選択し、プロパティで「ビルドアクション」を「埋め込みリソース」に変更します。
同じ .DLL を参照として追加する必要があり、
using ExternalNamespace;
それを使用するクラスの先頭にステートメントを配置する必要があります。そうでない場合、コンパイル時に外部 DLL コードを認識できないため、ビルド プロセスは失敗します。bin
そのため、ビルド後のアクションとして、最終フォルダーから .DLL ファイル (埋め込まれたクローンではない) を削除する必要があります。