1


したがって、基本的には、コンポーネントの 1 つである App.exe によって使用される厳密な名前 (厳密に署名された) アセンブリ x.dll があります。アセンブリの署名キーはリポジトリにあり、アセンブリは書き込みによって署名されています

[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFileAttribute(@"..\..\xxx.snk")]
[assembly: AssemblyKeyName("")]

アセンブリは、共通パッケージをインストールするインストーラーによって GAC に配置されることになっています。common.msi という名前にしましょう。ただし、コンポーネント自体は App.msi によってインストールされます。一緒に展開すると、すべてが機能します。しかし、x.dll とはまったく関係のない変更が App.msi に加えられ、App.msi が再展開されると、App.exe は x.dll を見つけられません。x.dll は変更されないことに注意してください。ただし、common.msi も展開すると、すべてが機能します。だから私は、ビルドバージョンか何か、または私が何も知らないマニフェストに問題があるに違いないと推測しています。私が間違っていることは明らかですか?アセンブリを個別に展開し、変更されない限り触れず、それを使用するコンポーネントが変更されるたびに再展開することはできませんか? ありがとう。

編集:ssemblyをGACに入れることは要件です(私には何もできません)

4

1 に答える 1

1

なぜGACにインストールするのですか?そうしないでください。

「アセンブリをGACに再デプロイする必要があります」という質問のタイトルが間違っています。あなたが書いたことは、アセンブリがGACにある必要があることを意味するものではありません。


編集 -いくつかの追加情報。

依存関係を調べたい場合は、RedgateのReflectorを使用して、App.exeなどのアセンブリを調べ、依存していて必要な他のアセンブリを特定できます。これらの依存関係にはバージョン番号が含まれます。

アセンブリ情報を出力するだけのコマンドラインツールを知りません。多分1つあります。これがないので、私はそれを行うためのツールを次のように作成しました。

    public static void Main(string[] args)
    {
        if ((((args == null) || (args.Length != 1)) || (args[0] == "-?")) || (args[0] == "-h"))
        {
            Usage();
        }
        else
        {
            try
            {
                Console.WriteLine(Assembly.LoadFrom(args[0]).FullName.ToString());
            }
            catch (Exception exception)
            {
                Console.WriteLine("Exception: {0}", exception.ToString());
                Usage();
            }
        }
    }

このツールをApp.exeおよびx.dllで実行して、各アセンブリに埋め込まれているバージョン番号を含む正確な厳密な名前を確認できます。

これは、物事が期待どおりに機能しない理由についての洞察を与えるのに役立つ場合があります。

x.dllの1つのバージョンがGACにある場合でも、そのバージョンのDLLを使用するためにApp.exeなどの任意のアプリは必要ありません。アプリは、ローカルディレクトリに独自のバージョンのdllをインストールできます。

于 2010-12-28T13:58:16.390 に答える