fsharp
fsharp copied to clipboard
Typeload Exception when function returns a delegate with voidptr parameter
Hi,
I am getting a strange TypeLoadException
in my code when I am trying to create a delegate that contains a voidptr
, but only when I return it.
System.TypeLoadException: 'The generic type 'Microsoft.FSharp.Core.FSharpFunc`2' was used with an invalid instantiation in assembly 'FSharp.Core, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.'
I am not sure if it's bug report, as I am probably doing something wrong - I am just really confused why the code compiles but blows up at runtime.
Repro steps
- Declare or reference a delegate that takes a voidptr parameter
- Create a function that returns that delegate
- Try to use that function
type MyDelegate = delegate of voidptr -> unit
let method ptr = ()
[<Fact>]
let test_runtime_kaboom () =
let getDelegate method = MyDelegate(method)
()
I have also attached an example project that reproduces that behavior below.
Expected behavior
I would expect that the call works without throwing an exception, because:
- the code compiles without any error or warning
- creating the delegate actually works, it's only when a function is declared that returns it, is when the problem occurs.
- changing the signature of the delegate from voidptr to any other type works as well
Actual behavior
A typeload exception is thrown.
System.TypeLoadException: 'The generic type 'Microsoft.FSharp.Core.FSharpFunc`2' was used with an invalid instantiation in assembly 'FSharp.Core, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.'
Known workarounds
None, except for creating and using the delegate instantly.
Related information
- Operating system - Win 10 Version 20H2 OS Build 19042.804
- .NET Runtime kind + .NET Core
- Editing Tools - Visual Studio TestExplorer, nCrunch / JetBrains Rider / dotnet test
Take care, Martin
sample.zip Added example zip
I’m getting this as well with PortAudioFsharp, and I have not found a workaround.
Known workarounds
None, except for creating and using the delegate instantly.
What do you mean by this? Any chance you could include a Console project that shows what you mean?