This tutorial came in clutch. Was just about to wrap up a current winform project and was wondering how to make the installer for it. Now I know, thanks Tim.
Thank you Tim for such a detailed tutorial. I really appreciate the time and effort you put into your videos. It's the small details you explain which matter the most to me, for example when you explained why the @ is used before a path string.
It's nice and uncommon that You take care of the recordings that you posted some time ago. Thank you for the time and energy You put into promoting knowledge.
Mr. Tim Corey, As a learner and beginner as a C# developer, I am in love with you. I learn a lot from your videos and your way of talking and explaining things is very awesome. Thank you so much for your time which you invest in people like me. May GOD bless you Sir :)
I have zero experience with ClickOnce MSI or install shield. This is exactly what i have been looking for. A simple explanation of this complicated process in its simplest form. I now have a foundation to move forward and learn other techniques.Thanks!
wow you save me! from clickonce, now I can deploy my apps using sql ccmpact edition and cryptography that click once does not support! Thank you for this amazing material.
Are you still going to make the future video showing how to automate this? As well as showing an example of how to do it through a different server, thank you for the amazing content !
Hello Tim again, I just wanted to thank you very much for your videos... I asked you on the video of SQLite demo video about a problem I get in deployment, but now with Squirrel, it is solved... So, Thank YOU A LOOOOOT! GREAT WORK SIR!!!
Very nice lecture Tim . Crysp and clear. And i dont know anything about deployment and even Release also in visual studio. I am the basic beginner. And I could understood in clear way. Will be waiting for you next video about Releasing to the GITHUB and autoupdate from GITHUB..
Excellent Tim. It was just what I was looking for. Look forward to see the automated process. Although, as long as it is for a simple and small app I would rather do it manually. Next Time, show us how to place an icon for the app.
You have helped me at work, school and even in personal projects. Thanks so much for these excellent videos! I am a much more competent programmer thanks to you :)
This video is...AWESOME!!! The way you explain everything step by step is incredible. I have a lot of question, actually..a lot of requirements but I'm pretty sure I will find answers on your videos!!! Thank you so much!!!
Great video. Thanks for the heads up on such an application (Squirrel that is) existing. It appears it will solve the install issue I have for a widely used corporate application.
Great tutorial. It would be great if you could show the next level with the automation of all those processes. However it is a good point to start. Thanks.
Amazing video Tim! Thanks for all your useful delivery on this video. Now, the next step would be maybe to give the user the choice to update or not the software version and make an automatic restart if so.
0:00 - Intro 1:12 - What we are going to do in this video 3:40 - What is Squirrel 7:02 - Squirrel GitHub page 8:43 - Squirrel NuGet reference 9:30 - Automatic application updates update check 15:55 - Assembly version changes 17:47 - Creating custom NuGet Package 27:04 - Installing the application 29:05 - Running the installed app and fixing bugs 33:49 - Updating the application code 37:06 - Releasing the updates 43:06 - Recap 45:20 - Summary and concluding remarks
Tim you made my day with this implementation. It is clean and as you mention, predictable and I'd say customizable and most important of all, it can be automated MUCH MUCH easier than a clickonce app. thanks for this great video. BTW. This worked like a charm on a WPF app.
Excellent and completely understandable tutorial! I tried it on a sample app and it just works as you described. I’m building an app that needs to be shared and users by a few people in our company. This may be the way as long as people don’t object to the automatic updates. Remains to be seen. The way you drilled down to grab the version number was a feat in database acrobatics and I’m not sure how I would have found it otherwise. Very much interested in a follow up video showing more advanced usage and automation. Thanks again!
A part two on the build automation side would be nice also Tim. i.e how to automate the manual steps at the end i.e. moving the folders to the temp folder etc. Do you plan to do a next version?
I've always just used the installer project in Visual Studio. Despite no longer being one of the default project types, you can still download it as a VS extension from the Visual Studio Marketplace. Squirrel does sound interesting though and I'll definitely check it out.
Yeah, I've struggled with that one over the years. It keeps getting bumped around and it is messy to work with. I almost did a video on it but decided squirrel is a much easier tool to configure and use for updating and it fits most use cases.
Microsoft can be extremely short sighted when it comes to basic common sense things. "Here's a great tool to build software but we're not going to give you any tools to distribute or install it once you've built it."
Yeah, I'm not sure the logic behind not including the installer. I'm guessing it has to do with not being their core focus but even so, they let their partnerships slide. It may be because they want the marketplace to fill this particular spot but it does seem like a rather important part to fill.
I’m not finding any follow up videos where you go more in depth, such as using a URL for the update location. Did you ever make any update videos? -Thanks.
I tried using URL from IIS Server and failed with 404 error but works perfectly if i try local path. Please if u have any video on URL kindly notify me. Thanks
This is exactly the tool that I needed for an application I am developing. Getting my users the new versions of my program can be challenging. The background updating is awesome. I am really looking forward to your future video showing the automatic releasing. I am wondering what happens if the new program files not are all downloaded before the main program is closed? What if the user only has the program open for a few seconds and the network connection is slow? A second question would be what happens if I am over writing the setup files while users program is trying to use them? Will that file be locked out somehow and be unable to be copied over?
Good questions. For the first, if you don't get the entire thing downloaded (unusual since it is a diff, not the full application), it will re-download the file. I'm not sure it will pick up where it left off in the download or not. It might. Either way, it will just work and not cause an issue. The second question was something I should have addressed in the video. There are no problems with locked files because it puts the application in a new folder (using the version number). Then, when you restart the application, it launches the new exe in the new location. It only keeps the previous version of your application so don't worry about hundreds of applications being on disk.
@@IAmTimCorey Thanks for the reply Tim! To clarify my second question: The step after "releasifying" using Squirrel 41:20, you copy the output files from releases and paste them over the "network location files" 42:05. Will this interfere with a user's outdated application which is trying to download the new files (maybe using "Releases" or "Setup.exe" or "Setup.ini") when I paste those files. Additionally, what if some files are copied but others are not when the user's outdated application wants to check for updates (some kind of strange race-like condition)? Could we use the Task object to monitor the result of the update check and be sure that after awaiting the task, Task.Status = TaskStatus.RanToCompletion of something like this?
Hey Tim, Can we choose a custom path for the final installed files? Squirrel gets installed into a app/.. ... .. . I want a custom folder where my program should be installed. Thanks
Good video, thanks. ClickOnce works pretty well in large enterprises where network storage is plentiful and easy to access. Small business clients with less robust infrastructure, however, are not very well-served by ClickOnce. The great thing about Squirrel is it looks like the FileDownloader class accepts a System.Net.WebClient object. This means that you can place the setup files on a password-protected web-facing server, even something simple like Apache. Because you can pass credentials with the WebClient object, Squirrel should have no problems accessing the files despite the password, something that ClickOnce unfortunately could not do. Thanks again for the great video.
How do you have two projects opened at the same time? (DemoLibrary and WindFormUI). I tried following along in the last video about connecting to the SQLite database, but could not figure out how you had two projects like that.
Great content... I love it. However, I realized that when you make the update, the data of the prior version in the application is lost with the new update. How can one fix this??
Yep, the idea here would be the database is a temp storage that is ok to overwrite. If you don't want to do this, you would need to either not deploy the database with the updates or you would need to have some type of programmatic check on if the database should be upgraded/migrated.
For example me I don't overwrite the database, if I made some changes in the database (new columns, tables, triggers ...) I write a script in the first form to check if this db have those tables or columns, here's an example of me checking if a table exists; string sqlTable1 = "IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='table1') " + " CREATE TABLE table1( " + " rowid int IDENTITY(1, 1) NOT NULL, " + " datec datetime2(0) DEFAULT GETDATE(), " + " dateo datetime2 NULL, " + " ref nvarchar(255) NULL, " + " CONSTRAINT PK_llx_saisie_caisse_rowid PRIMARY KEY(rowid) " + " )"; SqlCommand cmdTable1 = new SqlCommand(sqlTable1 , cnx); cmdTable1.ExecuteNonQuery();
@@IAmTimCorey Hey Tim, I was able to update automatically using Githubupdatemanager method of the updatemanager function, then adding release 1, 2 and so on. IT automatically pulls files from there. Another question, you did not show how to setup path, where the files will be saved once end user runs the exe or msi. Can you please guide me real quick on that here?
Hi Tim, this is a great video. It answer all my question about creating installer and version updated. I have one problem here. I simply put my application setting into files. And this squirrel update process will created new version folder, which make me lost my setting files in old version folder. Do you have any idea to solve my problem? I have in mind to put my setting file in different directory, but i don't know where to put it. thanks for sharing
You would probably need to write some code to move your files into a different location and then only create them if they don't exist. As for where, that would be up to you.
@@IAmTimCorey : I have a small question- Installer automatically installing application in C:\ Programfile \ . Can we modify setup in a way that it will prompt user to enter Installation location. For example user wants to install in D:\programfile. . Thanks in Advance :)
Hi. EDIT: Solved: Don't forget to give your Application a Title in the NuGet Explorer. Otherwise it won't show up. lol I have a little Problem: I wrote a little, useless App (400KB) to try this out. Basicly 3 buttons, 1 shows an Info Message Box, 2 opens a URL and 3 closes the Application. I made it as a WPF Solution. I put some Code in the AssemblyInfo (Version) and of course into MainWindow.xaml and MainWindow.xaml.cs. Everything works fine, I was able to put the App onto a Share and the DevTeam could receive it via Setup.exe and the new Version updated automaticly - Good Tutorial, Super easy, Great Job Tim! Now my Problem is that none of us can uninstall the App correctly. We have to delete the folders in order to get rid of the App. I couldn't figure out why that is. Any ideas?
@@IAmTimCorey I forgot to put a Title. It was the reason why it didn't appear in Programs and Features. In Apps and Features I found a nameless program with the same size as the exe. Then I put a Title and was able to uninstall it in programs and features too. Thanks for your reply :)
Good tutorial! Off topic -> I'd like to know whether Desktop application development is a good Field out there in the industry? Like, will I be able to go for a highly paid salary?
@mike m.: Really? Is there any WYSIWYG app development environment targeting the browser/JavaScript that is as simple and effective as WinForms in Visual Studio? It's a serious question.
I hear this a lot, which is funny because I also rub shoulders with a lot of consultants. For example, at the Microsoft MVP conference this past year, a question was raised about which desktop UI was most prevalent. WinForms won hands down (80%+). When I ask about desktop vs. web, the responses are mixed. A lot of companies have desktop apps and a lot of startups are creating desktop apps. The reason people think desktop is dead is because they forget that there is more out there than just small shops trying to get their product to a large market. Enterprises especially use a LOT of desktop applications. Think of all of the applications on your computer. Most of them are desktop apps (Office, Visual Studio, SSMS, Audacity, Beyond Compare, WebStorm, Notepad++, flux, and more are just a few of the ones I use daily). Web apps are great for distribution but desktop apps still beat them out for power, ease of development, offline capabilities, and more. Here is my advice: learn C# really well (the language, not the user interfaces to it). People often think that C# is a UI. It isn't. The UI uses C#. If you are skilled just in a UI, you will always struggle. If you are skilled in C#, you will do well no matter what UI you end up working with. Most companies don't care as much about your UI of choice as they do your skill level with C#. That is where the real work gets done.
A quick look on Monster.ca proves that isn't true. There are a couple jobs in just the first page of the search that are for C# desktop developers. Web development is a big deal because of the perceived lack of expense for the reach. However, these statements like desktop development being "dead" are just not true. Like I said, learn C#. The UI doesn't really matter. You want to do all of your examples in MVC? Go ahead. It will be a lot more setup work but you can do it. Anyone who throws out a good tool because another is also good is foolish. Take advantage of both tools. Don't just throw out one for the other.
Nice video Tim and thank you for sharing this valuable information as always. I have a simple question and it is as follows: does it triggers Microsoft Windows Smartscreen if it is shared to other Windows platforms? Thank you in advance!
This is awesome, thanks for sharing. This seems like a silly question, but I assume it's best to make 1.0.2 from the 1.0.1 .nupkg file (so the delta only shows the difference between these two), rather than making 1.0.2 from the 1.0.0 file again (which I gather would show all the differences from the very first release). Edit: new problem, noticed that every release I make, even if I made no change to the database file wipes the database on the updated end. Can see this between 42:45 - 42:50. Probably more a conundrum if the database structure itself needs modifying. Guessing fixing this requires accessing the AppData folder to grab any existing user-entered data and re-inserting it after the Squirrel update.
As for the versioning, you don't build from the nupkg file, you build from the source so I'm not tracking how it went from 1.0.0 to 1.0.2. The source changed so we changed the nupkg file. As for the database, yes, this is not an ideal way to deploy a database unless it was used for caching (and an update would wipe your cache). If you wanted to save data between versions, you would need to include update scripts instead of the database.
Nice video easy to understand, Can we update the database file especially if it's a SQLServer database, and also what if we use the application as a network version where we have the database stored on the server, or is that to much to ask for from this free tool.
Hi Tim, Great video! Do you have any recommendations for a WPF project that calls on some separate python scripts, where the end user wouldn't have python installed already? Or any recommended videos?
Hey, the video was really helpful. I'd like to make it even better by automating the tasks you mentioned. I looked for the follow-up video but couldn't find it. Are there any updates on this?
Just wondering how this is better than ClickOnce. I was able to get ClickOnce deployment with self-updating from intranet site working perfectly. The only downsides with ClickOnce are inability to create Test vs Prod versions of the same application and when an update is forced via the minimum required version, it cannot be easily reverted (without publishing another new version and incrementing the minimum required version again). What was it about ClickOnce that made you go down this path?
There are a couple things, including the fact that ClickOnce seems to be touchy. Rollback is easy, no UAC is nice, background updates, easy package creation and hosting, and a lot more. The bottom line is it felt simpler with more power vs. ClickOnce. That isn't a knock on ClickOnce though. If you find it works for you, I don't see any reason to switch.
and you just got data loss.. "Jane Smith" is missing after the silent update. So better don't ship the database with the executable and instead let it be created if nessecary. Btw how can you implement a db update script with squirrel?
Yeah, I forgot to mention that. The bundling should not have included the database or the database should have been set not to overwrite. I'll add update scripts as a suggestion for the next squirrel video.
Great video, as always... You have used SQLite DB for database storage which makes it easy to update the database structure... Is there a way to update the sql server database for any changes that have been made in the SQL Database Project.... e.g. If I have added a new table and some stored procedures to the SQL Project, is there a way to check whether the database structure has been changed and make the necessary changes to the deployed database...
Hi Tim. I have a question. How can a create an installer for a service using topshelf. I saw you video about creating a service with topshelf, but how can I actually create an installer. Thanks in advance.
Well, you could use a bat file to do the installation. Or you could write a PowerShell script to do it. Or you could probably use an MSI file. I don't have examples to show you, though. I'll add that to the suggestion list.
Hey Tim, great video and really helpful. After doing this, what is the best way to deliver this to the customer without hosting on the cloud. As in if this was just going to one person/one company and I wanted them to have my application. Can you send the release folder generated by Squirrel through email?
Just curious, what determines the Program Group that my executable is found under? I have 3 different programs that I want to place under the same program group. 2 of them organize under my company name (in the authors field in my .nupkg file) but the 3rd which also has our company name as the author shows up under the executable name instead of the author. Any thoughts? Love it otherwise!
I have this working from an S3 Bucket - How can I test for a new release being available on the server - then notify the app that a restart is required, with a checkbox or similar?
I want to integrate this with a CI/CD system (TeamCity) which makes a release for each checkin, but does this mean that I need a script that manually modifies the version in AssemblyInfo.cs? It feels a little... weird to modify that file every time. I'll see if that file can load the version from a text file (which I auto-generate) or something.
This solution should point you in the right direction. Essentially, you should be able to use MSBuild to update it for you: stackoverflow.com/questions/14254554/how-to-update-the-value-in-assemblyinfo-cs-dynamically
Hi Tim, nice video. One question : at time 42:43 when the app updates itself from 1.0.0 to 1.0.1, the " jane smith" entry has been deleted from the local database.. Is there a way not to override the local database please ? thanks
You would need to not include it in the deployment file. Maybe have the app either create the database if it does not exist or have it download the database if it doesn't exist.
Great video!!! I have a question, though. Is there a way that after application updates itself can restart with a new version? Looks like, only when we close/reopen the application a new version will be running. Thanks!
Technically yes, you can listen for the application update to be complete and restart the application but by that time, the user will be using the application. People hate being interrupted. Now apps like Chrome will tell you there is an update but wait until you are ready for it. I would recommend following that pattern instead.
hey Tim What do you think about wix Toolset for creating msi installer. Could you please do a video on wix with a custom ui installer(not the custom dialogue boxes.)
I am getting an error when trying to create the using statement for Squirrel My project is a .net v5 project. Do you have any suggestions? Package 'DeltaCompressionDotNet 1.1.0' was restored using '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8' instead of the project target framework 'net5.0-windows7.0'. This package may not be fully compatible with your project.
Hi Tim, how would one go about making file associations during the install process? ie; my program uses my own file format and I want the user to be able to launch the application when that file is opened. How could I go about setting that up?
Thank you so much Tim for your many helpful videos. I just learnt about you recently through youtube search and your videos have been incredibly helpful. I am actually new into programming generally and even more so with the c# Lang. Please I want to know if you have a video on winforms software licensing and protection. If not please kindly do a video about that. You can as well point me to any good resources that might be helpful for me to understand and make good choices. I am working on a VSTO Word Add-in, which is how I normally choose to do my learning and I believe the methods of deployment & security applies across all projects that are .Net. Again, thanks.
Check out this video that I made to help folks plan their training. ua-cam.com/video/LUv20QxXjfw/v-deo.html. Also, you can check out my whole channel and playlists here - ua-cam.com/channels/-ptWR16ITQyYOglXyQmpzw.html
I read through the comments to this video but didn't see an answer to my question so I will ask it... How do you go about deploying updates without overwriting the SQLite database? In the video example, you added a person (leaving 2 people in the database), deployed the update, then ran the program again reverting back to a single person in the list. Obviously, we want the users to not have to start over from scratch when deploying an update such as adding the version number to the title. Thanks!
Good question and it is something I wish I had remembered to cover in the video. I'll be covering it in another video. You have to make some tweaks to the installer.
Is it possible use squirrel to create a setup.exe for launch another application developed in Delphi ? I mean now iam using advanced installer to create an .msi, for launch my delphi application but i would like to do this using squirrel
Great video Tim. Is it possible in Squirrel.windows to do the updates from Web server folder where folder is protected by login & password ? I've tried to use filedownloader but I do not see where I could pass those credentials. Any hint or help would be very appreciated. Thank you.
Hmmm, not sure about that. I think you would probably need to either modify Squirrel or go a different route. Maybe bake a tool into your application that unlocks the folder and downloads the changes. Then, squirrel would see the changes the next time it loads up (since it would be pointed at the local folder, not the protected web folder). It would be a two-step process but it should work.
Thank you for swift reply. I will try ftpWebrequest to download the files to local app folder do updates using squirrel and delete local folder. Would be nice if they will add this funcionality to squirrel to download updates from protected folders.
Hello Tim, A great tutorial as always, Squirrel however doesn't support .Net Core as far as I know.. Is that true? and is there a work around or an alternative?
Squirrel doesn't really care about .NET types. It is a .NET Framework installer, meaning that is what powers it, but it can install pretty much anything. You can install .NET Core projects or even Java projects with Squirrel.
hi. Thanks for the clear demo. I have a question. when the system is updating the latest version and consider it is taking little time based on the network speed. and the user has closed the application. so still the updation will continue in the back ground?
No, if the application closes then the update will stop. But don't worry, it will pick back up the next time without an issue. You won't get into the issue of a half-update causing issues.
Hey Tim, great video. I did have a question. I see that Nuget Package Explorer requires Windows 10 as an operating system. Is there an alternative you recommend that works with Squirrel on Windows 7?
@@DiegoBotelho I got it from here. www.softpedia.com/get/Programming/Other-Programming-Files/NuGet-Package-Explorer.shtml However, clicking on the .exe file doesn't install the application on your machine it only runs it. I haven't quite figured out what the deal is but it works fine.
Hello, thanks for your great work. I have a burning problem. How do I handle the connection string? Do I have to change it every time I'm deploying an app to another machine other than the one I used for development? Your assistance will be appreciated.
It depends. If your database is in a different location then yes. Usually your database doesn't move. It is on a server and everyone has access to it. In that case, there is no need to change the connection string.
Thank you and congratulations on 40k subscribers. It feels awesome when I say I'm one of your first subscribers. :)
Thanks!
This tutorial came in clutch. Was just about to wrap up a current winform project and was wondering how to make the installer for it. Now I know, thanks Tim.
Awesome!
Thank you Tim for such a detailed tutorial. I really appreciate the time and effort you put into your videos. It's the small details you explain which matter the most to me, for example when you explained why the @ is used before a path string.
I appreciate that!
It's nice and uncommon that You take care of the recordings that you posted some time ago. Thank you for the time and energy You put into promoting knowledge.
You're very welcome.
Mr. Tim Corey, As a learner and beginner as a C# developer, I am in love with you. I learn a lot from your videos and your way of talking and explaining things is very awesome. Thank you so much for your time which you invest in people like me. May GOD bless you Sir :)
I appreciate the kind words.
Great tutorial! Feel guilty that I can only leave 1 thumbs up for all the work you put into this. Thank you
You are most welcome. Thanks for watching.
I have zero experience with ClickOnce MSI or install shield. This is exactly what i have been looking for. A simple explanation of this complicated process in its simplest form. I now have a foundation to move forward and learn other techniques.Thanks!
Excellent!
wow you save me! from clickonce, now I can deploy my apps using sql ccmpact edition and cryptography that click once does not support! Thank you for this amazing material.
Glad it helped!
It's been a while since this video was made -- do you still recommend Squirrel, and is it still being supported?
Are you still going to make the future video showing how to automate this? As well as showing an example of how to do it through a different server, thank you for the amazing content !
Hello Tim again,
I just wanted to thank you very much for your videos... I asked you on the video of SQLite demo video about a problem I get in deployment, but now with Squirrel, it is solved... So, Thank YOU A LOOOOOT! GREAT WORK SIR!!!
Excellent!
Very nice lecture Tim . Crysp and clear. And i dont know anything about deployment and even Release also in visual studio. I am the basic beginner. And I could understood in clear way. Will be waiting for you next video about Releasing to the GITHUB and autoupdate from GITHUB..
Thanks!
Learned some thing very useful.This thing is good man. Plus dapper video was also helpful.
I am glad you learned something new.
Excellent Tim. It was just what I was looking for. Look forward to see the automated process. Although, as long as it is for a simple and small app I would rather do it manually. Next Time, show us how to place an icon for the app.
Yep, I can do that.
You have helped me at work, school and even in personal projects. Thanks so much for these excellent videos! I am a much more competent programmer thanks to you :)
You're very welcome!
Great tutorial, looking forward to more advance tutorial
Thank you!
This video is...AWESOME!!! The way you explain everything step by step is incredible. I have a lot of question, actually..a lot of requirements but I'm pretty sure I will find answers on your videos!!! Thank you so much!!!
You are most welcome. Thanks for watching.
Great, easy to understand and clear video about squirrel. Awesome!
Thank you!
Many thanks, Corey! As always, you are such a big help!
You are welcome.
Great video. Thanks for the heads up on such an application (Squirrel that is) existing. It appears it will solve the install issue I have for a widely used corporate application.
Excellent!
Great tutorial. It would be great if you could show the next level with the automation of all those processes. However it is a good point to start. Thanks.
It is on the suggestion list. I'm glad you enjoyed the video.
I agree. This was great but I’m on the lookout for the next level of automation and feature usage. Thanks!
Magnificent explanation. I didn't know about squirrel but i will have it in account in the future.
Great!
Amazing video Tim! Thanks for all your useful delivery on this video. Now, the next step would be maybe to give the user the choice to update or not the software version and make an automatic restart if so.
0:00 - Intro
1:12 - What we are going to do in this video
3:40 - What is Squirrel
7:02 - Squirrel GitHub page
8:43 - Squirrel NuGet reference
9:30 - Automatic application updates update check
15:55 - Assembly version changes
17:47 - Creating custom NuGet Package
27:04 - Installing the application
29:05 - Running the installed app and fixing bugs
33:49 - Updating the application code
37:06 - Releasing the updates
43:06 - Recap
45:20 - Summary and concluding remarks
Thank you kind sir!
Tim you made my day with this implementation. It is clean and as you mention, predictable and I'd say customizable and most important of all, it can be automated MUCH MUCH easier than a clickonce app. thanks for this great video.
BTW. This worked like a charm on a WPF app.
You are most welcome. Thanks for watching.
Excellent and completely understandable tutorial! I tried it on a sample app and it just works as you described. I’m building an app that needs to be shared and users by a few people in our company. This may be the way as long as people don’t object to the automatic updates. Remains to be seen. The way you drilled down to grab the version number was a feat in database acrobatics and I’m not sure how I would have found it otherwise. Very much interested in a follow up video showing more advanced usage and automation. Thanks again!
You are welcome.
Your videos are my favorite, you're an amazing tutor.
I appreciate the kind words.
Thanks Tim. I love Squirrel.
You are welcome.
I enjoyed Inno Setup, But will try Squirrel this week. Thank you
Have fun!
A part two on the build automation side would be nice also Tim. i.e how to automate the manual steps at the end i.e. moving the folders to the temp folder etc. Do you plan to do a next version?
I added it to Tim's list for topics to consider. Thanks for recommending it.
Hey there, did you ever get around to posting the automation tutorial mentioned around @8:00
Not yet. It is still on the list.
@@IAmTimCorey Hello! great tutorial, is it still on the list? or it was posted time ago?. however thanks you so much :)
Any update on the video where we put our updates on a web server somewhere? Or maybe Azure storage accounts?
Super awesome Tim. Thank you
Glad you enjoyed it
As always, great tutorial. Thanks.
You are most welcome. Thanks for watching.
Really it's a Great content... Thank You very Very much tim.
Thanks for trusting Tim for your training.
What's the alternative now that Squirrel.Windows is dead and doesn't work properly with .NET Core anyway?
I touch on that in my new video - ua-cam.com/video/zjVgQNfAEOs/v-deo.html
Thank you so much. Clear and complete.
You are welcome.
Just one like button is not enough, it should be 1,000,000. Thank you, Tim.
You are most welcome. Thanks for watching.
I've always just used the installer project in Visual Studio. Despite no longer being one of the default project types, you can still download it as a VS extension from the Visual Studio Marketplace. Squirrel does sound interesting though and I'll definitely check it out.
Yabba Dabba Does the installer project do everything that squirrel is doing here?
Yeah, I've struggled with that one over the years. It keeps getting bumped around and it is messy to work with. I almost did a video on it but decided squirrel is a much easier tool to configure and use for updating and it fits most use cases.
Microsoft can be extremely short sighted when it comes to basic common sense things. "Here's a great tool to build software but we're not going to give you any tools to distribute or install it once you've built it."
Yeah, I'm not sure the logic behind not including the installer. I'm guessing it has to do with not being their core focus but even so, they let their partnerships slide. It may be because they want the marketplace to fill this particular spot but it does seem like a rather important part to fill.
This is fantastic. Thanks!
You are most welcome. Thanks for watching.
Excellent video, Tim! Do you have any tutorials on how to develop a licensing component for an app? And if the license is invalid the app won't open?
I don't have a video like that. Please add it to the list on the suggestion site so others can vote on it as well: suggestions.iamtimcorey.com/
I’m not finding any follow up videos where you go more in depth, such as using a URL for the update location. Did you ever make any update videos?
-Thanks.
Not yet. It is on the list but I've got a ton of videos that I need to get to.
I tried using URL from IIS Server and failed with 404 error but works perfectly if i try local path. Please if u have any video on URL kindly notify me. Thanks
Hello and thanks for this very clair video :)
You are welcome.
Thank you for video. You helped me much.
You are welcome.
This is exactly the tool that I needed for an application I am developing. Getting my users the new versions of my program can be challenging. The background updating is awesome.
I am really looking forward to your future video showing the automatic releasing.
I am wondering what happens if the new program files not are all downloaded before the main program is closed? What if the user only has the program open for a few seconds and the network connection is slow?
A second question would be what happens if I am over writing the setup files while users program is trying to use them? Will that file be locked out somehow and be unable to be copied over?
Good questions. For the first, if you don't get the entire thing downloaded (unusual since it is a diff, not the full application), it will re-download the file. I'm not sure it will pick up where it left off in the download or not. It might. Either way, it will just work and not cause an issue.
The second question was something I should have addressed in the video. There are no problems with locked files because it puts the application in a new folder (using the version number). Then, when you restart the application, it launches the new exe in the new location. It only keeps the previous version of your application so don't worry about hundreds of applications being on disk.
@@IAmTimCorey Thanks for the reply Tim!
To clarify my second question: The step after "releasifying" using Squirrel 41:20, you copy the output files from releases and paste them over the "network location files" 42:05. Will this interfere with a user's outdated application which is trying to download the new files (maybe using "Releases" or "Setup.exe" or "Setup.ini") when I paste those files.
Additionally, what if some files are copied but others are not when the user's outdated application wants to check for updates (some kind of strange race-like condition)? Could we use the Task object to monitor the result of the update check and be sure that after awaiting the task, Task.Status = TaskStatus.RanToCompletion of something like this?
Hey Tim,
Can we choose a custom path for the final installed files? Squirrel gets installed into a app/.. ... .. . I want a custom folder where my program should be installed. Thanks
Thank you so much! You are a life saver
You're welcome!
mr tim did u uploaded video for update from webserver as u said in this video ( 12:00 ) ?
it was a good session. Thank you so much. One qq, how does it work in the LAN?
Good video, thanks. ClickOnce works pretty well in large enterprises where network storage is plentiful and easy to access. Small business clients with less robust infrastructure, however, are not very well-served by ClickOnce. The great thing about Squirrel is it looks like the FileDownloader class accepts a System.Net.WebClient object. This means that you can place the setup files on a password-protected web-facing server, even something simple like Apache. Because you can pass credentials with the WebClient object, Squirrel should have no problems accessing the files despite the password, something that ClickOnce unfortunately could not do.
Thanks again for the great video.
You are most welcome. Thanks for watching.
How do you have two projects opened at the same time? (DemoLibrary and WindFormUI). I tried following along in the last video about connecting to the SQLite database, but could not figure out how you had two projects like that.
After you create your first project, right-click on the solution and select "Add Project" to add a second project.
@@IAmTimCorey thanks! What is the benefit of putting a lot of your sql code into a second project?
Great Tim!...Thanks a lot
You are welcome.
For application upgrade... How we can handle if SQLite schema change?
Thanks in Advance :)
Thanks, I added it to my suggested topics list.
Great content... I love it. However, I realized that when you make the update, the data of the prior version in the application is lost with the new update.
How can one fix this??
Yep, the idea here would be the database is a temp storage that is ok to overwrite. If you don't want to do this, you would need to either not deploy the database with the updates or you would need to have some type of programmatic check on if the database should be upgraded/migrated.
For example me I don't overwrite the database, if I made some changes in the database (new columns, tables, triggers ...) I write a script in the first form to check if this db have those tables or columns, here's an example of me checking if a table exists;
string sqlTable1 = "IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='table1') "
+ " CREATE TABLE table1( "
+ " rowid int IDENTITY(1, 1) NOT NULL, "
+ " datec datetime2(0) DEFAULT GETDATE(), "
+ " dateo datetime2 NULL, "
+ " ref nvarchar(255) NULL, "
+ " CONSTRAINT PK_llx_saisie_caisse_rowid PRIMARY KEY(rowid) "
+ " )";
SqlCommand cmdTable1 = new SqlCommand(sqlTable1 , cnx);
cmdTable1.ExecuteNonQuery();
Helped me so much!!!! Thanks.
You're welcome!
This is enormously helpful! Thanks very much, with a question: does signing one's application affect any part of this?
Again, thanks!
did you make the other video- the advanced version? I would like make a humble request. Can you do it with firebase, or SQL database?
Thanks for the suggestion. Please add it to the list on the suggestion site so others can vote on it as well: suggestions.iamtimcorey.com/
@@IAmTimCorey Hey Tim, I was able to update automatically using Githubupdatemanager method of the updatemanager function, then adding release 1, 2 and so on. IT automatically pulls files from there.
Another question, you did not show how to setup path, where the files will be saved once end user runs the exe or msi. Can you please guide me real quick on that here?
Really helpfull tutorial! Thanks!
You are welcome.
Hi Tim, this is a great video. It answer all my question about creating installer and version updated. I have one problem here. I simply put my application setting into files. And this squirrel update process will created new version folder, which make me lost my setting files in old version folder. Do you have any idea to solve my problem?
I have in mind to put my setting file in different directory, but i don't know where to put it.
thanks for sharing
You would probably need to write some code to move your files into a different location and then only create them if they don't exist. As for where, that would be up to you.
Hi Tim, is it possible to avoid the auto start of the application after install/update? Maybe with the manifest? Tnx
Thanks Alot for helpful video.
You are welcome.
@@IAmTimCorey : I have a small question- Installer automatically installing application in C:\ Programfile \ . Can we modify setup in a way that it will prompt user to enter Installation location. For example user wants to install in D:\programfile. . Thanks in Advance :)
thanks Tim!!
You are welcome.
Hi.
EDIT: Solved: Don't forget to give your Application a Title in the NuGet Explorer. Otherwise it won't show up. lol
I have a little Problem:
I wrote a little, useless App (400KB) to try this out. Basicly 3 buttons, 1 shows an Info Message Box, 2 opens a URL and 3 closes the Application. I made it as a WPF Solution. I put some Code in the AssemblyInfo (Version) and of course into MainWindow.xaml and MainWindow.xaml.cs.
Everything works fine, I was able to put the App onto a Share and the DevTeam could receive it via Setup.exe and the new Version updated automaticly - Good Tutorial, Super easy, Great Job Tim!
Now my Problem is that none of us can uninstall the App correctly. We have to delete the folders in order to get rid of the App. I couldn't figure out why that is. Any ideas?
It should be that you just go to Apps and Features and uninstall it. Maybe their is a quirk about your permissions or something?
@@IAmTimCorey I forgot to put a Title. It was the reason why it didn't appear in Programs and Features. In Apps and Features I found a nameless program with the same size as the exe. Then I put a Title and was able to uninstall it in programs and features too. Thanks for your reply :)
thanx a lot Tim
You are welcome!
Good tutorial!
Off topic -> I'd like to know whether Desktop application development is a good Field out there in the industry? Like, will I be able to go for a highly paid salary?
@mike m.: Really? Is there any WYSIWYG app development environment targeting the browser/JavaScript that is as simple and effective as WinForms in Visual Studio? It's a serious question.
I hear this a lot, which is funny because I also rub shoulders with a lot of consultants. For example, at the Microsoft MVP conference this past year, a question was raised about which desktop UI was most prevalent. WinForms won hands down (80%+). When I ask about desktop vs. web, the responses are mixed. A lot of companies have desktop apps and a lot of startups are creating desktop apps. The reason people think desktop is dead is because they forget that there is more out there than just small shops trying to get their product to a large market. Enterprises especially use a LOT of desktop applications. Think of all of the applications on your computer. Most of them are desktop apps (Office, Visual Studio, SSMS, Audacity, Beyond Compare, WebStorm, Notepad++, flux, and more are just a few of the ones I use daily). Web apps are great for distribution but desktop apps still beat them out for power, ease of development, offline capabilities, and more.
Here is my advice: learn C# really well (the language, not the user interfaces to it). People often think that C# is a UI. It isn't. The UI uses C#. If you are skilled just in a UI, you will always struggle. If you are skilled in C#, you will do well no matter what UI you end up working with. Most companies don't care as much about your UI of choice as they do your skill level with C#. That is where the real work gets done.
A quick look on Monster.ca proves that isn't true. There are a couple jobs in just the first page of the search that are for C# desktop developers. Web development is a big deal because of the perceived lack of expense for the reach. However, these statements like desktop development being "dead" are just not true. Like I said, learn C#. The UI doesn't really matter. You want to do all of your examples in MVC? Go ahead. It will be a lot more setup work but you can do it. Anyone who throws out a good tool because another is also good is foolish. Take advantage of both tools. Don't just throw out one for the other.
Nonsense Mike. You need to get out more and see what's going on in the world.
Nice video Tim and thank you for sharing this valuable information as always. I have a simple question and it is as follows: does it triggers Microsoft Windows Smartscreen if it is shared to other Windows platforms? Thank you in advance!
This is awesome, thanks for sharing. This seems like a silly question, but I assume it's best to make 1.0.2 from the 1.0.1 .nupkg file (so the delta only shows the difference between these two), rather than making 1.0.2 from the 1.0.0 file again (which I gather would show all the differences from the very first release).
Edit: new problem, noticed that every release I make, even if I made no change to the database file wipes the database on the updated end. Can see this between 42:45 - 42:50. Probably more a conundrum if the database structure itself needs modifying. Guessing fixing this requires accessing the AppData folder to grab any existing user-entered data and re-inserting it after the Squirrel update.
As for the versioning, you don't build from the nupkg file, you build from the source so I'm not tracking how it went from 1.0.0 to 1.0.2. The source changed so we changed the nupkg file. As for the database, yes, this is not an ideal way to deploy a database unless it was used for caching (and an update would wipe your cache). If you wanted to save data between versions, you would need to include update scripts instead of the database.
How to avoid SQLite-db being replaced during update of app? when I deploy a new version, the db-file are replaced with an empty db.
Don't deploy it as part of the package. Download it independently and update it manually.
Super helpful video Tim. Does this work with UWP apps?
No, UWP apps are a different animal. You would need to use MSIX to deploy those.
Great video, you already have the most complex one, where can you download and install it?
The source code is linked in the description.
Nice video easy to understand, Can we update the database file especially if it's a SQLServer database, and also what if we use the application as a network version where we have the database stored on the server, or is that to much to ask for from this free tool.
That is a lot but I'll see what I can put together for a demo for the more advanced version of this video.
Hi Tim, Great video! Do you have any recommendations for a WPF project that calls on some separate python scripts, where the end user wouldn't have python installed already? Or any recommended videos?
Well you could use pyinstaller to convert the scripts into exe files, and call on those
Hey, the video was really helpful. I'd like to make it even better by automating the tasks you mentioned. I looked for the follow-up video but couldn't find it. Are there any updates on this?
No, I didn’t create a video on automating this process.
Just wondering how this is better than ClickOnce. I was able to get ClickOnce deployment with self-updating from intranet site working perfectly. The only downsides with ClickOnce are inability to create Test vs Prod versions of the same application and when an update is forced via the minimum required version, it cannot be easily reverted (without publishing another new version and incrementing the minimum required version again). What was it about ClickOnce that made you go down this path?
There are a couple things, including the fact that ClickOnce seems to be touchy. Rollback is easy, no UAC is nice, background updates, easy package creation and hosting, and a lot more. The bottom line is it felt simpler with more power vs. ClickOnce. That isn't a knock on ClickOnce though. If you find it works for you, I don't see any reason to switch.
Hi Tim, the C# Desktop App Deployment with Squirrel .NET 8
in Full Course? Where can I go to learn it?
I do not have a full course on that, no. Beyond this video, you would need to go to the documentation to learn how to use it.
Great Stuff!
Thanks!
and you just got data loss.. "Jane Smith" is missing after the silent update. So better don't ship the database with the executable and instead let it be created if nessecary.
Btw how can you implement a db update script with squirrel?
Yeah, I forgot to mention that. The bundling should not have included the database or the database should have been set not to overwrite. I'll add update scripts as a suggestion for the next squirrel video.
Great video, as always... You have used SQLite DB for database storage which makes it easy to update the database structure... Is there a way to update the sql server database for any changes that have been made in the SQL Database Project.... e.g. If I have added a new table and some stored procedures to the SQL Project, is there a way to check whether the database structure has been changed and make the necessary changes to the deployed database...
You would have to do it manually for SQLite. For SQL Server, if you use SSDT to build your database, you can have it deploy the changes as necessary.
Hi Tim. I have a question. How can a create an installer for a service using topshelf. I saw you video about creating a service with topshelf, but how can I actually create an installer. Thanks in advance.
Well, you could use a bat file to do the installation. Or you could write a PowerShell script to do it. Or you could probably use an MSI file. I don't have examples to show you, though. I'll add that to the suggestion list.
Hey Tim, great video and really helpful. After doing this, what is the best way to deliver this to the customer without hosting on the cloud. As in if this was just going to one person/one company and I wanted them to have my application. Can you send the release folder generated by Squirrel through email?
Squirrel is meant to be web-based. If you want to deploy via a USB drive or something similar, create an MSI file instead.
Just curious, what determines the Program Group that my executable is found under? I have 3 different programs that I want to place under the same program group. 2 of them organize under my company name (in the authors field in my .nupkg file) but the 3rd which also has our company name as the author shows up under the executable name instead of the author. Any thoughts? Love it otherwise!
I have this working from an S3 Bucket - How can I test for a new release being available on the server - then notify the app that a restart is required, with a checkbox or similar?
I want to integrate this with a CI/CD system (TeamCity) which makes a release for each checkin, but does this mean that I need a script that manually modifies the version in AssemblyInfo.cs? It feels a little... weird to modify that file every time. I'll see if that file can load the version from a text file (which I auto-generate) or something.
This solution should point you in the right direction. Essentially, you should be able to use MSBuild to update it for you: stackoverflow.com/questions/14254554/how-to-update-the-value-in-assemblyinfo-cs-dynamically
@@IAmTimCorey Seems sensible, thank you!
Hi Tim, nice video. One question : at time 42:43 when the app updates itself from 1.0.0 to 1.0.1, the " jane smith" entry has been deleted from the local database.. Is there a way not to override the local database please ? thanks
You would need to not include it in the deployment file. Maybe have the app either create the database if it does not exist or have it download the database if it doesn't exist.
@@IAmTimCorey got it. I will try leaving the database out of deployment. Thanks !!
Hi Tim, I have a program connected to SQL server, how can I include the SQL server in the package?!
Thanks in advance!
Great video!!!
I have a question, though. Is there a way that after application updates itself can restart with a new version?
Looks like, only when we close/reopen the application a new version will be running.
Thanks!
Technically yes, you can listen for the application update to be complete and restart the application but by that time, the user will be using the application. People hate being interrupted. Now apps like Chrome will tell you there is an update but wait until you are ready for it. I would recommend following that pattern instead.
@@IAmTimCorey Thank you!
await mgr.UpdateApp(); UpdateManager.RestartApp();
hey Tim
What do you think about wix Toolset for creating msi installer.
Could you please do a video on wix with a custom ui installer(not the custom dialogue boxes.)
I haven't used it much but I can add that suggestion to the list.
Yes please add it to the suggestion list.
Hi @IAmTimCorey! Can it work in network mode, server - client ? Any unpleasant experiences with this? Great stuff, Thank you!
Sure, it works just fine on a network. You might need to use an internal "web address" for the updates, but that's no big deal.
I am getting an error when trying to create the using statement for Squirrel
My project is a .net v5 project. Do you have any suggestions?
Package 'DeltaCompressionDotNet 1.1.0' was restored using '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8' instead of the project target framework 'net5.0-windows7.0'. This package may not be fully compatible with your project.
Hi Tim, did I got this straight: The use case would be, to give the updatemanager a URL, where it can find the new version on a public web reference?
Yep. That way it could update your app regardless of where you app was located (not even on the same network).
Hi Tim, how would one go about making file associations during the install process? ie; my program uses my own file format and I want the user to be able to launch the application when that file is opened. How could I go about setting that up?
You would need to use an MSI rather than Squirrel since this requires OS changes.
Thank you so much Tim for your many helpful videos. I just learnt about you recently through youtube search and your videos have been incredibly helpful. I am actually new into programming generally and even more so with the c# Lang. Please I want to know if you have a video on winforms software licensing and protection. If not please kindly do a video about that. You can as well point me to any good resources that might be helpful for me to understand and make good choices. I am working on a VSTO Word Add-in, which is how I normally choose to do my learning and I believe the methods of deployment & security applies across all projects that are .Net. Again, thanks.
Check out this video that I made to help folks plan their training. ua-cam.com/video/LUv20QxXjfw/v-deo.html. Also, you can check out my whole channel and playlists here - ua-cam.com/channels/-ptWR16ITQyYOglXyQmpzw.html
@@IAmTimCorey okay. I will do that right away. Thanks.
I read through the comments to this video but didn't see an answer to my question so I will ask it... How do you go about deploying updates without overwriting the SQLite database? In the video example, you added a person (leaving 2 people in the database), deployed the update, then ran the program again reverting back to a single person in the list. Obviously, we want the users to not have to start over from scratch when deploying an update such as adding the version number to the title. Thanks!
Good question and it is something I wish I had remembered to cover in the video. I'll be covering it in another video. You have to make some tweaks to the installer.
Thanks, Tim! Great videos!
Is it possible use squirrel to create a setup.exe for launch another application developed in Delphi ? I mean now iam using advanced installer to create an .msi, for launch my delphi application but i would like to do this using squirrel
Great video Tim. Is it possible in Squirrel.windows to do the updates from Web server folder where folder is protected by login & password ? I've tried to use filedownloader but I do not see where I could pass those credentials. Any hint or help would be very appreciated. Thank you.
Hmmm, not sure about that. I think you would probably need to either modify Squirrel or go a different route. Maybe bake a tool into your application that unlocks the folder and downloads the changes. Then, squirrel would see the changes the next time it loads up (since it would be pointed at the local folder, not the protected web folder). It would be a two-step process but it should work.
Thank you for swift reply. I will try ftpWebrequest to download the files to local app folder do updates using squirrel and delete local folder. Would be nice if they will add this funcionality to squirrel to download updates from protected folders.
Hello Tim,
A great tutorial as always,
Squirrel however doesn't support .Net Core as far as I know.. Is that true? and is there a work around or an alternative?
Squirrel doesn't really care about .NET types. It is a .NET Framework installer, meaning that is what powers it, but it can install pretty much anything. You can install .NET Core projects or even Java projects with Squirrel.
hi. Thanks for the clear demo. I have a question. when the system is updating the latest version and consider it is taking little time based on the network speed. and the user has closed the application. so still the updation will continue in the back ground?
No, if the application closes then the update will stop. But don't worry, it will pick back up the next time without an issue. You won't get into the issue of a half-update causing issues.
I use Inno Setup for quick deployment. Only for basic stuff though. Alot simpler than anything else i've seen on windows
Thanks for the suggestion. It is one of the things on my list to cover one of these days.
Hey Tim, great video. I did have a question. I see that Nuget Package Explorer requires Windows 10 as an operating system. Is there an alternative you recommend that works with Squirrel on Windows 7?
I might have just answered my own question. I just found a version of NuGet Package Explorer for Windows 7.
Excellent! I'm glad you figured it out.
Hi @@JALEMYmeservey , can you post the link to download it? thanks in advance.
@@DiegoBotelho I got it from here. www.softpedia.com/get/Programming/Other-Programming-Files/NuGet-Package-Explorer.shtml
However, clicking on the .exe file doesn't install the application on your machine it only runs it. I haven't quite figured out what the deal is but it works fine.
Hello, thanks for your great work.
I have a burning problem. How do I handle the connection string? Do I have to change it every time I'm deploying an app to another machine other than the one I used for development? Your assistance will be appreciated.
It depends. If your database is in a different location then yes. Usually your database doesn't move. It is on a server and everyone has access to it. In that case, there is no need to change the connection string.