3

.NETにプラグインシステムを実装しました。ベースライブラリは、プラグインに公開された基本的なクラスとインターフェイスを実装します。プラグインライブラリは、公開されたクラスとインターフェイスを使用するためにベースライブラリをリンクします。

私が直面している問題は、ベースライブラリの(単純な)再コンパイル(変更の有無にかかわらず)により、プラグインをロードできず、例外メッセージが表示されることです。

 "Could not load file or assembly 'BaseLibrary, Version=0.0.1.68, Culture=neutral, PublicKeyToken=7b445b12e635292c' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)"

この問題は、ベースライブラリとプラグインライブラリを一度にコンパイルすることで解決されますが、このフェーズではベースライブラリを頻繁に変更するため、開発中はあまり快適ではありません。

バイナリマッチングを「緩和」する方法はありますか?

ベースライブラリアセンブリ情報(以下に引用)が問題の原因である可能性はありますか?

 [assembly: AssemblyVersion("0.0.1.*")]

アセンブリが署名されていることを忘れました。


アセンブリは、次のルーチンを使用してロードされます

Assembly hLibrary = Assembly.LoadFile(pPath);
Type plugImageCodecFactoryType = hLibrary.GetType("Derm.ImageCodecPluginFactory", true, false);
object plugImageCodecFactory = Activator.CreateInstance(plugImageCodecFactoryType);
object plugInstance;

MethodInfo plugFactoryCreate = plugImageCodecFactoryType.GetMethod("CreatePlugin", BindingFlags.Instance|BindingFlags.Public);

plugInstance = plugFactoryCreate.Invoke(plugImageCodecFactory, null);

if (plugInstance is IImageCodecPlugin)
    RegisterPlugin((IImageCodecPlugin)plugInstance);
4

3 に答える 3

4

AssemblyVersionとAssemblyFileVersionの使用に関するより詳細な説明については、これらの質問と回答をお読みください。

DLLを参照するときにビルド番号を無視する

AssemblyVersionとAssemblyFileVersionの違い

短いバージョンでは、AssemblyVersionを変更する必要があるのは、そのアセンブリに潜在的に重大な変更を導入した場合にのみ、扶養家族に新しいバージョンを取得させることです。

小さな変更については、AssemblyFileVersionを使用して違いをマークできます。

したがって、開発には静的アセンブリバージョンを使用し、今後管理する安定版リリースに到達したらそれをインクリメントし、将来のバージョンインクリメントを手動で管理します。

于 2011-08-23T09:56:15.280 に答える
1

Visual Studioを使用していると仮定して、プラグインであるプロジェクトの1つにある参照を確認します。ベースライブラリへの参照のプロパティを見るとき、SpecificVersionフラグは何に設定されていますか?に設定してみてFalse、違いが生じるかどうかを確認してください。

プロジェクトがコンパイル済みDLLへの直接参照ではなくプロジェクト参照を使用している場合、このフラグは表示されないことに注意してください。この場合、試したようにベースライブラリで固定リビジョン番号を使用するか、SpecificVersionプロパティを変更できるように、代わりにDLLへの直接参照を使用するように切り替える必要があります。

于 2011-08-23T09:53:14.350 に答える
0

コンパイラエラーがベースライブラリについて話しているので、ここではプラグインとは何の関係もありません。プラグインのベースアーキテクチャを実装したことを考えると、プラグインは完全にデコピーしてレイジーにロードする必要があります。したがって、プラグインの読み込みに問題がある場合でも、コンパイル時ではなく実行時に遭遇します。

だから私にとっての原因はあなたのアセンブリバージョンです。

よろしく。

于 2011-08-23T09:18:38.340 に答える