2012-04-12 68 views
2

我有一個應用程序使用插件模型在運行時加載程序集的情況。大多數這些裝配對於隨着時間推移而修改的普通裝配具有進一步的依賴性。爲什麼在混合模式程序集中不能使用強版本?

例如,插件A依賴於Common的版本1,而插件B依賴於Common的版本2。

插件是自包含的,並且常用程序集是強命名的,所以在純粹的管理環境中,不同的通用程序集會被加載,並且不存在來自不同通用版本的類型之間的意外轉換的危險,並且一切正常。

從混合模式程序集加載(這是要求)時,我們處於第一個加載程序集「勝利」的情況。所以在這個例子中,插件B會嘗試加載Common V1,因爲在舊版本的程序集中缺少一些類型,在我們的案例中會引發TypeLoadException。

我們如何強制C++/CLI環境遵守插件中引用的版本?

我們已經嘗試:針對相應的版本

  • 使用#using

  • 在.NET參考對話框特定版本參考使用針對相應的版本

    1. /FU編譯器選項強名稱組件。

    這些都不能有效地引導V2程序集。

    更新:這裏有一些關於系統的更多細節,它很敏感,所以我會堅持上面的A/B語言。

    CommonAssembly.dll v1和v2(C#)強命名

    PluginA:使用/ clr編譯的C++/CLI,CommonAssembly V1與/ FU編譯器選項引用

    PluginB:C++/CLI編譯/ clr,使用/ FU編譯器選項引用的CommonAssembly v2

    主要應用程序:非託管 - 在運行時加載PluginA和PluginB,沒有直接引用。

    非託管應用程序加載PluginA,它加載了CommonAssembly v1。應用程序然後嘗試加載需要CommonAssembly v2的PluginB。 CLR嘗試使用v1來代替,並且存在TypeLoadException。

  • 回答

    0

    混合模式程序集包含本地部分,並且無法將此本機部分的多個副本加載到單個進程中。

    混合模式程序集在AppDomain中也不能很好地運行,因爲本地部分是進程範圍的。

    重命名其中一個版本可能會帶來一些好運,因爲這就是Windows跟蹤本機DLL的方式。

    +0

    現在常見的dll是一個純粹的託管dll,因此每個混合模式插件只能被加載一次。有什麼地方可以知道Ivan在混合模式程序集的這個方面閱讀的地方嗎? – 2012-04-12 19:15:50

    +0

    @Steve:我不確定你的設置是什麼。你需要列出你所有的程序集,版本,每一個都是C#,C++'/ clr'還是C++'/ clr:pure',以及依賴於什麼。 – 2012-04-12 20:31:26

    +0

    我加入了關於系統的更多細節。我們正在嘗試重命名一些DLL,但我們只是遇到其他崩潰。 – 2012-04-13 12:26:14

    相關問題