Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The type or namespace name 'Span<>' could not be found #28

Open
MateiGiurgiu opened this issue Jun 3, 2020 · 36 comments
Open

The type or namespace name 'Span<>' could not be found #28

MateiGiurgiu opened this issue Jun 3, 2020 · 36 comments
Assignees
Labels

Comments

@MateiGiurgiu
Copy link

MateiGiurgiu commented Jun 3, 2020

I get this error when I import the package. I mention that I am using the package manager for this as described in the readme. The weird thing is that a couple a days ago I managed to import this into an empty project and it worked. I tried deleting the cache, switching the scripting backend. Importing System.Memory from NuGet but nothing seems to be able to fix it.

Do you have any idea what might be the cause?

Using Unity 2019.3.15f1 and Visual Studio 2019

image

@MateiGiurgiu
Copy link
Author

MateiGiurgiu commented Jun 3, 2020

I just went back to the empty project where LASP imported successfully and I realized that as soon as I right-click > Open C# project, the error appears.

Additionally, I added the System.Memory.dll in the Plugins folder and now the error that I have is:
image

I also enabled "Allow 'unsafe' code" option in player setting but it didn't help.

@keijiro keijiro self-assigned this Jun 4, 2020
@MateiGiurgiu
Copy link
Author

I did more testing today. In the empty project where LASP initially imported successfully, I managed to get rid of the errors by reimporting the project. However, I realized that the error is caused by a third party plugin called Quantum Console. As soon as I imported it the exact error appeared again and I couldn't do anything to make it disappear.

@Ryne9
Copy link

Ryne9 commented Jun 5, 2020

Seeing the same issue on 2019.3.10f1 with the ReadOnlySpan in ChannelLayout and the Spans in Device.

@keijiro
Copy link
Owner

keijiro commented Jun 5, 2020

@Ryne9 Are you using Quantum Console too?

@Ryne9
Copy link

Ryne9 commented Jun 7, 2020

Nope, two biggest libraries I'm using are UniVRM and TwitchLib, I can test adding them to a new project tomorrow and seeing what happens.

@keijiro
Copy link
Owner

keijiro commented Jun 7, 2020

@Ryne9 Thanks for the additional info. I'd appreciate if you could check which one causes the error.

@Ryne9
Copy link

Ryne9 commented Jun 7, 2020

Ah, I think it is directly related to setting the Project Settings > Player > Other Settings > Configuration > Api Compatibility Level from .NET Standard 2.0 to .NET 4.x

apicompat

@MateiGiurgiu
Copy link
Author

Thank you. However, I was already on .NET 4.x and I tested it with both compatibility levels and scripting backends.

I noticed that Quantum Console comes with a link.xml file which from my understanding is used for configuring how the code is stripped. Could this be the cause of the problem?
image

@MateiGiurgiu
Copy link
Author

I did more testing. I managed to successfully import both LASP and Quantum Console in the same project as long as initially the project is set to .NET Standard 2.0. As soon as I move it back to .NET 4.x I get errors:
image

image

Moreover, I imported LASP into another empty project set to .NET Standard 2.0 and as soon as I switch to .NET 4.x the errors appeared again.

@keijiro
Copy link
Owner

keijiro commented Jun 9, 2020

@MateiGiurgiu Thank you very much for further testing. It seems that there is something wrong with the API compatibility setting. Actually, I only tested LASP with the .NET Standard 2.0. I'll do extensive tests with .NET 4.x for the next version of LASP.

Just out of curiosity, do you need .NET 4.x for your project? I have never used .NET 4.x on my projects, so I overlooked the point.

@Ryne9
Copy link

Ryne9 commented Jun 9, 2020

Personally I've never needed to change API compatibility until I wanted a Twitch library so I used TwitchLib.Unity which required it. After this issue I did think of rewriting/investigating since Lasp is way more important for my project at the moment

@keijiro
Copy link
Owner

keijiro commented Jun 9, 2020

Twitch requires .NET 4.x. Okay. That's a valuable input. Thanks.

@MateiGiurgiu
Copy link
Author

My thoughts are on the same lines as @Ryne9. I don't need .NET 4.x in the project at the moment. When I got LASP, the only reason I wanted to see if it works properly on both compatibility levels was that the project is in early development and I might need some plugins in the future which may require 4.x and I didn't want to have problems at that point.

Long story short I am developing an audio visualizer app and at the moment I implemented a custom system to process the audio signal (taken using NAudio) using FFT in order to generate the spectrum. Then I discovered LASP which seems way more attractive due to low-latency and normalization features among others. Therefore, I prefer to stick with .NET Standard 2.0 if LASP will become a core component of the project.

Is LASP using the libsoundio wrapper that you wrote? And, if yes, does that mean that LASP only supports 64bit systems?

@keijiro
Copy link
Owner

keijiro commented Jun 10, 2020

Is LASP using the libsoundio wrapper that you wrote? And, if yes, does that mean that LASP only supports 64bit systems?

Yes, it only supports x64 at the moment.

@MateiGiurgiu
Copy link
Author

@keijiro I just found a limitation of .NET Standard 2.0. I was trying to make a windows native file browser dialog and I require System.Windows.Forms.dll. I made a file csc.rsp and added: "-r:System.Windows.Forms.dll". However, this works only with .NET 4.x.

@melMass
Copy link

melMass commented Dec 3, 2020

Unsafe should work as long as your project settings (or asmdef) "allow for unsafe code" which is unchecked in your case

@marcospgp
Copy link

marcospgp commented Jan 31, 2021

Got this error and fixed it by setting the API compatibility level to .NET Standard 2.0 as mentioned above:

image

Though I am not quite clear on the difference between the two options. From what I've read, setting the compatibility level to .NET 4.x should not remove support for any feature, only increasing the available API surface.

Maybe Span<T> is a newer feature and unique in being supported only by .NET Standard 2.0?

Anyway it could be useful to add this info to the readme 🙂

@Nolram12345
Copy link

+1 this issue, Net 4.x is now often required by various other tools.

@Nolram12345
Copy link

grafik
Even after switching to 2.0 I still get this error.

@keijiro
Copy link
Owner

keijiro commented Feb 7, 2021

@marcospgp

From what I've read, setting the compatibility level to .NET 4.x should not remove support for any feature, only increasing the available API surface.

No. Those documents are written in the .NET 3.5 era so has been outdated. Now, NET Standard 2.0 is the recommended option in general cases.

Maybe Span is a newer feature and unique in being supported only by .NET Standard 2.0?

Actually, that's a new feature in .NET Standard 2.1. We can use it on .NET Standard 2.0 by adding the nuget package.

@keijiro
Copy link
Owner

keijiro commented Feb 7, 2021

@Nolram12345

Net 4.x is now often required by various other tools.

Could you give me an example? I'm curious about the reasons why .NET 4.x is still used in some cases.

Even after switching to 2.0 I still get this error.

This error message is not related to LASP. Please try removing other unrelated packages.

@keijiro
Copy link
Owner

keijiro commented Feb 7, 2021

@marcospgp Sorry. The first paragraph in the last reply might be not correct. I should admit that I'm not a .NET specialist. Please ask a specialist for further details.

@keijiro
Copy link
Owner

keijiro commented Feb 7, 2021

Note that there is the same issue in KlakNDI.

keijiro/KlakNDI#72

The conclusion here is the same to KlakNDI. There is no plan for fixing it, but this issue should be kept opened for future reference.

@Nolram12345
Copy link

@keijiro A json data storing tool I am using requires .NET framework which is only supported in 4.x . And I am unsure what exactly you mean since in the error it states that a namespace is missing from LASP - and the script that is asking for it is from Klak Audio. (Which is the reason I am trying to install LASP in the first place).

@keijiro
Copy link
Owner

keijiro commented Feb 8, 2021

@Nolram12345 If you're using KlakLasp, it's not compatible with the current version of LASP.

@Nolram12345
Copy link

@keijiro Then what version do I need ? Is it even still supported/does it still work ?

@keijiro
Copy link
Owner

keijiro commented Feb 8, 2021

@Nolram12345

Lasp v1 is still in the master branch.

https://github.com/keijiro/Lasp/tree/master

I haven't been touched it for some years, so I'm not sure if it still works.

Please use the issue tracker on the KlakLasp repository for further questions. It's not relevant to the original question in this thread.

@Nolram12345
Copy link

@keijiro Sure. Thank you.

@ChiefBreakeverything
Copy link

Unfortunately I'm also in the same boat. I'm getting this Span<> error on import and I'm trying some stuff out with Arduino depth sensors (or Kinect as a backup) but it seems that both require .Net 4.x. I'm really keen to try Lasp out though...

@hnguyen094
Copy link

I think the issue is with the NuGet package dependencies (e.g. org.nuget.system.memory). Specifically, they have a "Define Constraint" NET_STANDARD_2_0 which isn't defined when targeting .NET 4.x (whether that's the correct behavior or not I'm not sure.)

The 'correct' solution is either to target .NET Standard 2.0, or (probably) manually include the correct .NET 4.x System.Memory.dll (and possibly its other dependencies that don't have the Define Constraint) by adding it to your project. Alternatively, @keijiro can maybe find another package dependency that don't have this define constraint.

Here's an 'incorrect' solution though: you might be able to get away with adding NET_STANDARD_2_0 to Scripting Define Symbols while still targeting .NET 4.x. I just tested this hack and it seems to work on 2020.3.1 (Mono .NET 4.x)

@keijiro
Copy link
Owner

keijiro commented Apr 7, 2021

@hnguyen094 Thanks for the write-up. That matches with my understanding.

@visible-sounds
Copy link

visible-sounds commented Mar 17, 2022

Had the same issue with both 2.0 and 4x for some reason.

Not sure if it makes much difference as Unity apparently doesn't use .NET 2.1 yet however I downloaded and installed .NET core 2.1

The solution for me was to directly download the dll for Span.

  1. You can get the library from the https://www.nuget.org/packages/System.Memory/ => Download Package

  2. Open it with WinRAR or similar.

  3. Import the System.Memory.dll from lib/netstandartd2.0 folder into your assets folder.

  4. Select System.Memory.dll in the editor, go to import settings in the inspect then Disable "Validate Reference"

After I did that I had error finding reference to Unsafe so did the same with the Unsafe package.
Maybe not required for some people
5) https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe/
Repeat steps 2 to 4 for this package.

Answer taken from and changed slightly by me, hope this helps someone :)
https://stackoverflow.com/questions/56885284/implement-spant-in-unity

@judasbenhur
Copy link

adding the following lines to the manifest.json fixed this issue for me in klakNDI.

"scopedRegistries": [ { "name": "Unity NuGet", "url": "https://unitynuget-registry.azurewebsites.net", "scopes": [ "org.nuget" ] } ],

and then inside the '"dependencies": {' bracket:
"org.nuget.system.memory": "4.5.3"

hope this helps.

@atesija
Copy link

atesija commented May 19, 2022

I ran into this on version 2020.3.14f1 even when using .NET Standard 2.0. Switched to 2019.4.0f1 instead and I'm able to use the library with no errors.

@prakyath-07
Copy link

prakyath-07 commented Sep 30, 2022

Add these to manifest file
"org.nuget.system.memory": "4.5.3"

"scopedRegistries": [
{
"name": "Unity NuGet",
"url": "https://unitynuget-registry.azurewebsites.net",
"scopes": [
"org.nuget"
]
}
]

@PatrickkLiu
Copy link

PatrickkLiu commented Nov 21, 2022

Here's an 'incorrect' solution though: you might be able to get away with adding NET_STANDARD_2_0 to Scripting Define Symbols while still targeting .NET 4.x. I just tested this hack and it seems to work on 2020.3.1 (Mono .NET 4.x)

the 'incorrect' solution worked for me after I switched to IL2CPP backend on 2019.4.6. Hope this helps!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests