Assembly Versioning in SharpDevelop

How the versions are set

The assemblyInfo.cs files are updated by the tool "UpdateAssemblyInfo". UpdateAssemblyInfo runs as pre-compile target and always sets the number in GlobalAssemblyInfo.cs to the number of commits since a hard-coded start commit (const string BaseCommit). That number is displayed in the splash screen, error dialog and about dialog. It is also used as assembly version.

The revision number is retrieved by running "git rev-list" and counting the number of output lines. When this doesn't work (e.g. in an exported tree like the source code download on the build server; or git not present in PATH), the content of the file src/REVISION is used as revision number. When even this fails, the revision '0' is used.

Publisher Policy

While the assembly versioning schema is not so important inside SharpDevelop, it is important for 3rd party addins because the main libraries like ICSharpCode.Core are strong-named. Normally, an assembly compiled against a strong-named assembly can only be used with exactly the version of the library it was compiled with.

This means if a 3rd-party addin was compiled against version 2.1.0.a, it cannot bind to version 2.0.0.b or 2.0.1.c; even if it would run without problems. Therefore, SharpDevelop.exe.config contains binding redirects for the strong-named libraries that addins would want to reference.

The binding redirects always redirect requests of a version in the range from some past version containing large breaking changes to the current version. We try to avoid such changes after the first release candidate of a SharpDevelop version, so after the release of SharpDevelop x.y RC1, all future SharpDevelop x.y.*.* versions will be in large parts binary compatible.
For example, SharpDevevelop 2.1.0.1708 uses this redirection:

<bindingRedirect oldVersion="2.1.0.1661-2.1.0.1708" newVersion="2.1.0.1708"/>

That means if you want to release a 3rd-party AddIn (AddIn that is not shipped with SharpDevelop), compile it against the oldest SharpDevelop version you want your AddIn to run with.
An AddIn compiled against 2.1.0.1800 will run with 2.1.0.1801 (and hopefully even with 2.1.23.45678), but an AddIn compiled against 2.1.0.1801 will fail to load in SharpDevelop 2.1.0.1800.

Additionally, your AddIn should include a <Dependency> in its .addin file to indicate which SharpDevelop version it is intended for. This way, users trying to install the AddIn in an incompatible SharpDevelop version will be warned about the incompatibility, instead of getting an obscure error message.

	<Manifest>
		<Identity name = "YourAddInName"/>
		<Dependency addin="SharpDevelop" version="5.0"/>
	</Manifest>