2011-08-23 93 views
3

我在.NET中實現了一個插件系統。基礎庫實現了基本的類和接口公開給插件,插件庫鏈接基礎庫使用暴露的類和接口。C#插件系統二進制兼容性問題

我現在面臨的問題是,基部庫(有或沒有修飾)的(簡單)重新編譯使插件不能夠被裝載,使異常消息:

"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

閱讀這些問題和解答,以獲得關於使用AssemblyVersion與AssemblyFileVersion的更全面討論。

Ignoring build numbers when referencing DLLs

Differences between AssemblyVersion and AssemblyFileVersion

短的版本是,當你介紹在該組件將迫使家屬採取了新的版本可能破壞改變你應該只改變的AssemblyVersion。

對於較小的更改,您可以使用AssemblyFileVersion來標記差異。

因此,我將使用靜態程序集版本進行開發,當您想要管理未來版本的穩定版本並手動管理將來的版本增量時,將其增加。

0

對我來說,這裏沒有親戚關係的插件,關於基礎庫編譯器錯誤會談,並考慮到你實現插件的基礎架構,插件必須加載完全放棄並加載懶惰。所以,即使存在插件加載問題,您仍然可以在運行時遇到並且不需要編譯時間。

所以對我來說,原因是你的程序集版本。

問候。

+0

是的,修復版本修改爲68(而不是默認的*),即使在基本庫重新編譯的情況下,插件也被正確加載並正常運行。那麼,如何忽略插件加載版本?我只想在主版本和次版本上標記二進制更改。 – Luca

+0

只留下0,那是什麼問題? – Tigran

+0

版本修訂版標識源/二進制版本。版本更改需要每個插件重新編譯(並且還要部署)。 – Luca

1

假設您使用的是Visual Studio,請查看其中一個插件項目中的引用。當您查看您的基本庫的引用屬性時,SpecificVersion標誌設置爲什麼?嘗試將其設置爲False,看看是否有所作爲。

請注意,如果您的項目使用的是項目引用而不是直接引用編譯的DLL,則此標誌將不存在。在這種情況下,您可能需要在基本庫上使用固定的修訂版本號,就像您嘗試的那樣,或者您應該切換到使用對DLL的直接引用,以便您可以更改SpecificVersion屬性。

+1

文件引用不會看到Debug/Release/x86/x64編譯。但Juozas Kontvainis的答案在http://stackoverflow.com/questions/915712/how-to-set-specific-version-property-for-project-references-in-visual-studio可以很好地解決這個問題在這個方向。 – Luca

+0

@Luca雖然OP沒有問及不同的彙編,但還是有用的信息 – RobV