3

他の DLL に外部依存する DLL を配布しています。DLL が欠落したり、さまざまな状況が混在したりする危険を冒すのではなく、独自の DLL/EXE 内に DLL を埋め込み、実行時にそれをロードしてランタイム リンクを満たします。

質問:

A) 間

  • DLL を .EXE/.DLL 内に埋め込み、実行時にメモリにロードして、
  • DLL をファイル システム上に別のファイルとして保持し、システムにそれをロードさせる

どちらのアプローチがより多くのメモリを消費し、おおよそどのくらい消費しますか?

B)上記よりも優れたアプローチを持っている人はいますか?特に、以下の詳細の項目 #3 について。


興味のある方向けのプロセスの詳細:

  1. アセンブリ内のコードが呼び出される前に実行されることがわかっている部分 (例: 初期化時間) で 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();
        }
    }
    
  2. アセンブリを埋め込みます。これは、.NET プロジェクトに「既存のアイテムを追加」することによって行われます => .dll を選択 => OK。戻って.dllを選択し、プロパティで「ビルドアクション」を「埋め込みリソース」に変更します。

  3. 同じ .DLL を参照として追加する必要があり、using ExternalNamespace;それを使用するクラスの先頭にステートメントを配置する必要があります。そうでない場合、コンパイル時に外部 DLL コードを認識できないため、ビルド プロセスは失敗します。binそのため、ビルド後のアクションとして、最終フォルダーから .DLL ファイル (埋め込まれたクローンではない) を削除する必要があります。

4

2 に答える 2

2

マークの提案どおり。

ILMerge を使用してすべてをまとめます。

ただし、それは不可能かもしれませんが、「純粋な」マネージ アセンブリ (を使用するアセンブリを含むunsafe) では機能するはずです。

于 2013-04-10T11:13:54.827 に答える