0

メインアプリケーションEXEをnGenする必要がある次のコードがあります。

using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;

namespace FileOnline.DesktopClient.Setup.Support {
    [RunInstaller(true)]
    public partial class CustomNGen : Installer {

        public override void Install(IDictionary stateSaver) {
            base.Install(stateSaver);
            ExecuteNGen("install", true);
        }

        public override void Uninstall(IDictionary savedState) {
            base.Uninstall(savedState);
            //CleanUpShortcuts();
            ExecuteNGen("uninstall", false);
        }

        private void ExecuteNGen(string cmd, bool validate) {
            var ngenStr = Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "ngen");
            var assemblyPath = Context.Parameters["assemblypath"];

            using (var process = new Process {
                StartInfo = {
                    FileName = ngenStr,
                    Arguments = string.Format(@"{0} ""{1}""", cmd, assemblyPath),
                    CreateNoWindow = true,
                    UseShellExecute = false
                }
            }) {
                process.Start();
                process.WaitForExit();

                if (validate && process.ExitCode != 0)
                    throw new Exception(String.Format("Ngen exit code: {0}", process.ExitCode));
            }
        }

    }

}

私が必要とするのは、EXE が nGen されるだけでなく、参照されるすべての DLL (私のソリューション全体) も nGen されることです。

私のEXEプロジェクトが呼び出されたとしましょう:

FileOnline.DesktopClient

そして、それはこれらに依存します:

FileOnline.DesktopClient.BaseControls
FileOnline.DesktopClient.BaseForms
FileOnline.DesktopClient.Utilities
FileOnline.DesktopClient.Dialogboxes
FileOnline.DesktopClient.HelpingExtension
FileOnline.DesktopClient.*More stuff*

ソリューション内の唯一の展開プロジェクトを介してこれらを nGen するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

3

これは自動で、ngen.exe は Assembly.GetReferencedAssemblies() を通じてこれらのアセンブリを見つけます。Assembly.Load/From() を使用して自分でロードするアセンブリを処理するだけで済みます。.exe.config ファイルに異常なバインディング ルールがある場合は、/execonfig オプションを確認してください。適切なアセンブリを見つけることができるように、ngen.exe もそれらを認識する必要があります。

別の方法については、こちらこちらをご覧ください。

于 2012-01-17T12:37:47.960 に答える