QRCoder: Base64QRCode does not exist in 1.4.3
Type of issue
[x] Bug
[ ] Question (e.g. about handling/usage)
[ ] Request for new feature/improvement
Expected Behavior
No build errors after minor upgrade of 1.4.2 to 1.4.3
Current Behavior
Upgrading my nuget package dependency from 1.4.2 to 1.4.3 caused build errors in my project, because Base64QRCode could not be found
Possible Solution (optional)
Looks to be related to NET6_0_WINDOWS directives that have been added in this release
Steps to Reproduce (for bugs)
- .Net 6 Web App.
- Add 1.4.2 QRCoder package
- Instantiate a Base64QRCode
- Compile / Run and observe no build error
- Upgrade to 1.4.3 package
- Attempt to build solution. Compiler error: The type or namespace name ‘Base64QRCode’ could not be found (are you missing a using directive or an assembly reference?)
Your Environment
TargetOS of Web App: None. By explicitly setting this to Windows, the compiler error is fixed, but this breaking change shouldn’t be introduced in a patch level version change.
About this issue
- Original URL
- State: closed
- Created 3 years ago
- Comments: 16 (3 by maintainers)
Commits related to this issue
- Added net6.0-windows compatibility — committed to codebude/QRCoder by codebude 3 years ago
Hello @ScottyLightnin ,
this is not bug in QRCoder but more the consequence of breaking changes in Microsoft .NET 6.0.
Explanation - Why are some renderers missing
Up to QRCoder 1.4.2 there was no explicit compilation target for .NET6, thus when apps (that target .NET 6.0) used QRCoder, the package manager/Visual Studio picked the .NET 5.0 binaries when choosing the nearest framework binary. The .NET 5.0 binaries support
System.Drawingand thus contain rendering classes like theBase64QRCodewhich makes use ofSystem.Drawing.Unfortunately not having .NET 6 as target in QRCoder lead to some serious trouble (see #354, #353) because not everything that works in .NET 5.0 also works in .NET 6.0 or in other words not all binaries/libraries to be available in .NET 5.0 can be expected available on .NET 6.0. Thus it was only consequent to add .NET 6.0 as target frameworks. I think you’re right up to this point?
With adding
net6.0andnet6.0-windowsas targets, I had to remove theSystem.Drawing-based renderers for the targetnet6.0, because Microsoft official says, thatSystem.Drawingfrom .NET 6.0 on only will be available on Windows platforms: https://docs.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-onlyTL;DR: It was not my decision to remove the
System.Drawing-based renderers fromnet6.0target, but I was simply following the breaking changes in .NET 6.0/System.Drawing (as described in the link above).What can you do now?
You have multiple options:
net6.0-windowsas the renderes like Base64QRCode or QRCode are available there.PngByteQRCodeorBitmapByteQRCode. They return the QR Code image as byte array. Then simply pass the bytes toConvert.ToBase64String(...)to receive the same output as for Base64QRCode.net6.0and thus via fallback tonet5.0allows you to use Base64QRCode. (The only difference between 1.4.2 and 1.4.3 are the newnet6.0targets as can be seen here: https://github.com/codebude/QRCoder/wiki/Release-notes )Mid-term solution
Mid-term we will move QRCoder from
System.Drawingto ImageSharp, becauseSystem.Drawingbecame a pain in the *** over the years. By replacing it with an alternative graphics lib (currently we aim to ImageSharp) we hope to gain wider support for the different platforms. Note: Since this will bring a lot of breaking changes, this will be released as QRCoder 2.X.XQRCodedoes not exist toooooooooooooooooooooooooooooooooAny time frame for version 2.0
Afterthought: I stand by the above changes. The only point where I can understand your displeasure @ScottyLightnin is that these (breaking) changes came with version 1.4.3 and not with a 2.0.0. It should be noted that the QRCoder has always increased the version number by one digit with each release (see here). According to strict/clean semantic versioning the 1.4.3 should have been a 2.0.0. I can see that. For the future (also with regard to QRCoder 2.X.X) I plan to increase the version numbers cleanly/according to semantic versioning.
@mhosman either stick to QRCoder 1.4.2 since 1.4.3 added only the explicit targets to net 6.0 or wait for QRCoder 2.0.0 which will be based on ImageSharp and thus support the full renderer stack again.
FYI: https://security.snyk.io/vuln/SNYK-DOTNET-SYSTEMDRAWINGCOMMON-3063427
Having breaking changes in a minor patch seems strange to me to be honest, I had no idea why my code stopped working when I updated from 1.4.1 to 1.4.3.
Otherwise great library!
Great explanations, thank you @codebude , and yes, you got my main point was that I wasn’t expecting a breaking change with the version change from 1.4.2 > 1.4.3. I’ve already been able to work around the problem (by targeting net6.0-windows), it was just unexpected since I’ve grown accustomed to semantic versioning. Thanks again for your work, and your detailed explanation. Much appreciated.