SharpAdb / AdvancedSharpAdbClient

AdvancedSharpAdbClient is a .NET library that allows .NET, Mono and Unity applications to communicate with Android devices. It's improved version of SharpAdbClient.
https://sharpadb.github.io
Apache License 2.0
203 stars 54 forks source link

Does not work in Unity due to 'init' keyword in properties #113

Open Monsoonexe opened 4 weeks ago

Monsoonexe commented 4 weeks ago

Describe the bug

The readme claims that this repo can be used in Unity (the game engine, I'm assuming). However, this is not the case (tested in 2020.3). This repo uses the 'init' keyword for properties, which are explicitly not a feature supported by unity: source

Steps to reproduce the bug

Download source. Go through each folder of the 'lib' folder and copy-paste .dll into /Plugins folder in Unity. It'll compile. Now in your code, try to use any property that uses the 'init' keyword (in my case, none of the properties on DeviceData are supported. If you try to access these properties in your code, when you recompile in Unity, you'll get an error in the console about "property... is not supported by the language...". Even picking .dll from .net framework 3.5 or 4.5 has same issues.

A work-around I use is to re-write the properties as extension methods and use Reflection to call the underlying get_Name auto-property functions.

Unity 2020.3 (but the Unity 6 doc suggest this feature is still unsupported). Using Mono scripting backend 4.x.

Expected behavior

I expected the claims to be correct -- all features are supported. If some features aren't supported, please notate as such.

Screenshots

image image

NuGet package version

Latest Source

.NET Platform

Others

Platform type

Windows

System version

No response

IDE

Visual Studio 2022

Additional context

No response

wherewhere commented 4 weeks ago

But unity said

Record support

C# 9 init and record support comes with a few caveats.

  • The type System.Runtime.CompilerServices.IsExternalInit is required for full record support as it uses init only setters, but is only available in .NET 5 and later (which Unity doesn’t support). Users can work around this issue by declaring the System.Runtime.CompilerServices.IsExternalInit type in their own projects.
  • You shouldn’t use C# records in serialized types because Unity’s serialization system doesn’t support C# records.

https://docs.unity3d.com/2021.2/Documentation/Manual/CSharpCompiler.html

Which means unity should supports init when IsExternalInit is declared. Maybe you need to set language version to 9 or later. Or maybe you need to compile it first.

2A5F commented 4 weeks ago

add csc.rsp in assets folder

-langVersion:preview

then use https://github.com/Cysharp/CsprojModifier set lang version to 11