2

厳密な名前の別のアプリケーション用のプラグインを開発しているため、それを参照するプラグインはバージョンごとに再コンパイルする必要があります。

そのため、Web サイトにログインするライブラリ (メイン アプリケーションを参照しない) があり、それを .dll としてコンパイルしました。

これは、各プラグインでログインして更新を確認するために使用するコードです。

var managerAssemblyPath = "Path to the .dll assembly";
var assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.FullName.Equals("AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"));
if (assembly == null)
{
    var assemblyBuffer = File.ReadAllBytes(managerAssemblyPath);
    assembly = Assembly.Load(assemblyBuffer);
}
var t = assembly.GetType("Namespace.Class");
if (t == null)
{
    var assemblyBuffer = File.ReadAllBytes(managerAssemblyPath);
    assembly = Assembly.Load(assemblyBuffer);
    t = assembly.GetType("Namespace.Class");
}
var methods = t.GetMethods();
var method = methods.Where(m => m.Name.Equals("CheckForUpdates")).ToArray()[1];
method.Invoke(null, new object[] { this.Id });

それは仕事を成し遂げます。読み込まれる最初のプラグインは、最初の 'if' 条件で assembly == null を持ち、ファイルを読み込みます。次に、型を取得し、CheckForUpdates メソッドを呼び出します。CheckForUpdates が呼び出されると、読み込まれたクラスは、Web サイトへのトラフィックを最小限に抑えるために、他のプラグインに必要なすべての情報を (静的クラスとして) キャッシュします。

次のプラグインは、FullName でアセンブリを見つけますが、型を見つけません。型が見つからないため、アセンブリを再度読み込みます。ここで問題が発生します。アセンブリが再度読み込まれるため、最初のプラグインによってキャッシュされた情報は使用されず、Web サイトに再度ログインします。

したがって、5 つのプラグインをインストールすると、ウェブサイトに 5 回ログインしますが、これは理想的ではありません。

dll からバイトを読み取ってから、バイトをロードすることをお勧めします。これは、この方法ではファイルがロックされず、通常、アプリケーションの多くのインスタンスを実行するためです。

アセンブリが一度だけ読み込まれるようにする方法を教えてもらえますか?

4

1 に答える 1