synhershko / NAppUpdate

A simple framework for providing auto-update support to .NET applications
http://www.code972.com/blog/2010/08/nappupdate-application-auto-update-framework-for-dotnet/
Apache License 2.0
525 stars 163 forks source link

Custom tasks from updated assemblies cannot be deserialized #34

Open xelibrion opened 11 years ago

xelibrion commented 11 years ago

Let's say that I have MyUpdateTask bundled within MySuperApp.exe, v.0.1. As soon as I release new version of this assembly, updater starts failing as it loads only new version of assembly into AppDomain and not the old one.

System.Runtime.Serialization.SerializationException: Unable to find assembly 'MySuperApp, Version=0.1, Culture=neutral, PublicKeyToken=null'.
   at System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name)
   at System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable)
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, IMethodCallMessage methodCallMessage)
   at NAppUpdate.Framework.Utils.NauIpc.ReadDto(String syncProcessName)
   at NAppUpdate.Updater.AppStart.Main()
synhershko commented 11 years ago

Sorry for not responding earlier - stupid GitHub notifications

This can probably be solved by having your custom Task in a separate DLL?

xelibrion commented 11 years ago

@synhershko yeah, this can be done, but it is just a workaround

synhershko commented 11 years ago

What do you propose?

xelibrion commented 11 years ago

Use less strict serialization format (JSON?) as this problem will appear for newer versions of NAppUpdate as well, as soon as you change assembly version

synhershko commented 11 years ago

This makes sense, yes. Could you provide a Pull Request for that?