0

dll を動的にロードするアプリケーションがあります。アプリケーションと dll は、アプリケーションと各 dll で異なるバージョンの Functions.dll を使用しますが、実行中、アプリケーションと dll はすべて同じ dll バージョン (EXE で使用されるバージョン) を使用し、静的なバージョンを共有します。変数...

独自の Functions.dll(n-version) を強制的に使用するにはどうすればよいですか?

-詳細:

  • 「Assembly dll = Assembly.LoadFile(」および「Assembly dll=domaindll.Load(」)でdllをロードしようとしました
  • Functions.dll では、すべてのメソッドとオブジェクトが静的です
  • 私はFunctions.dllを「静的に」使用し、動的ではなくすべての場合にVSを介して参照します
  • dll と Functions.dll も C# で開発されています。

-フォルダの構造:

応用:

Application.EXE
Functions.dll(version 1.2)
DLLS:
    EXAMPLEDLL1:
        EXAMPLEDLL1.DLL
        Functions.dll(version 1.1)
    EXAMPLEDLL2:
        EXAMPLEDLL2.DLL
        Functions.dll(version 1.0)
    EXAMPLEDLL3:
        EXAMPLEDLL3.DLL
        Functions.dll(version 1.2)
4

3 に答える 3

4

厳密に署名することにより、特定のバージョンの DLL へのバインドを強制できます。参照プロパティで「特定のバージョン」を true に設定することもできますが、コンパイル時のバインディングにのみ影響し、アセンブリが強力に署名されていない場合は実行時に別のバージョンをロードできることがわかっている限り.

これで始められるはずです:マネージド アプリケーションの厳密な名前の署名

ただし、この dll で宣言された型は、別のバージョンのアセンブリの同じ型と型が等価ではないことに注意してください。たとえば、 で呼び出されるクラスを宣言するとFoo、バージョン 1.0 のFunctions.dllインスタンスは、バージョン 1.1Fooのインスタンスと同じ型にはなりません。FooCLR に関する限り、これらは完全に異なる型です。

アセンブリに静的関数しかなく、型が定義されていない場合は、問題ありません。それ以外の場合は、別のアプローチを検討する必要があります。

于 2009-06-10T15:00:06.337 に答える
0

これを行うには、(サンプル) DLL を個別の AppDomains にロードする必要があると思います。クロス AppDomain 呼び出しを行うと、パフォーマンスが少し低下しますが、強調したシナリオではそれは避けられません。

于 2009-06-10T15:00:24.013 に答える
0

最後に、それを使用するEXAMPLEDLLと一致するようにFunctions.dllの名前を変更して解決しました....例:Application.EXE-->FunctionsApplication.dll EXAMPLEDLL1.dll-->FunctionsEXAMPLEDLL1.dll とにかく答えてくれてありがとう..

Postdata: dll に正しく署名できた別のケースでは、Adam Robinson の回答が正しいと思います (そして jerryjvl が 2 番目の anwser です)。

于 2009-06-15T07:00:50.567 に答える