Search Issue Tracker
Assemblies not being reloaded when reimporting C# script asset
How to reproduce:
1. Open the user's project "AOP_REV2.zip"
2. Open "SampleScene" Scene
3. Click on "GameObject" in the Hierarchy window
4. In the Inspector window right-click on "Expensive Operation Sample" Script
5. Click on "XD238" and look at the console
6. In Project window -> Assets -> ITnnovative -> AOP -> Sample
7. Edit "ExpensiveOperationSample" Script edit 21'st line and change Debug.Log message to something else
8. Save and Reimport asset
9. Repeat 3 - 5 steps
10. Repeat 3 - 9 steps again
Expected results: Console logs out a message that the user changed to in the 7th step
Actual results: Console logs out the "JUST XD" again
Reproducible with: 2019.4.16f1, 2020.1.16f1, 2020.2.0b14, 2021.1.0a8
Couldn't test with: 2018.4.30f1 (Couldn't downgrade to a working project)
Note: New message appears after the first script change, but not after later ones
Dec 03, 2020 10:19
Reproduced on 2019.4.15f1. It requires project to be recompiled before changing variable to attach additional Weaving methods to Unity Editor AssemblyReloadEvents. Then after changing it's not updating text anymore. May be heavily affected by PC configuration.
I think it's because Unity wants to reload assembly while it's still being modified by external code, which locks the file, so it cannot be used by other software incl. Unity.
Tested on: R9 3900X OC 4.8GHz, RTX 2070 Super Gigabyte Gaming OC (default), 64GB DDR4 3600MHz CL17, NVMe SSD 3GBps.
All about bugs
View bugs we have successfully reproduced, and vote for the bugs you want to see fixed most urgently.
- [Android] TouchScreenKeyboard.active triggers an error when set to false in the Player
- [Android] Auto-correct suggestions show up over the "hidden zone" when typing text with TouchScreenKeyboard
- [Android] Clicks on the "hidden zone" remain blocked when TouchScreenKeyboard is active
- [URP][DX12] Black Game View window when URP Dynamic Resolution is enabled
- VideoPlayer.Time is not updated when seeking is completed
The project in question is modifying the compiled assembly, by weaving the assemblies. This is non-support workflow.
By removing all the weaving code, the problem is resolved and changing the message will correctly reload the code.
Looking at the code here is my take away:
You are creating a circular dependency inside Assembly-CSharp. You can see that by using a tool like DotPeek or any assembly decompiler.
Because of this, the original Assembly-CSharp will not be unloaded.
Cecil might be causing problems for you here. As you are calling ImportReference. When doing this on a type in the very same assembly you are calling from, you are screwed.